Add support for MIPS R6.
authorAndrew Bennett <andrew.bennett@imgtec.com>
Wed, 10 Sep 2014 10:32:01 +0000 (11:32 +0100)
committerAndrew Bennett <andrew.bennett@imgtec.com>
Mon, 15 Sep 2014 11:15:55 +0000 (12:15 +0100)
commit7361da2c952eb96d1869e49e35e8bc95ab42074a
treec427e271b015d6a2c690c7536c513369085588f9
parentea79f94a7ab96c6114b80bf78830f877325b10ff
Add support for MIPS R6.

bfd/
  * aoutx.h (NAME (aout, machine_type)): Add mips32r6 and mips64r6.
  * archures.c (bfd_architecture): Likewise.
  * bfd-in2.h (bfd_architecture): Likewise.
  (bfd_reloc_code_real): Add relocs BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2, BFD_RELOC_MIPS_18_PCREL_S3 and
  BFD_RELOC_MIPS_19_PCREL_S2.
  * cpu-mips.c (arch_info_struct): Add mips32r6 and mips64r6.
  * elf32-mips.c: Define relocs R_MIPS_PC21_S2, R_MIPS_PC26_S2
  R_MIPS_PC18_S3, R_MIPS_PC19_S2, R_MIPS_PCHI16 and R_MIPS_PCLO16.
  (mips_reloc_map): Add entries for BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2, BFD_RELOC_MIPS_18_PCREL_S3,
  BFD_RELOC_MIPS_19_PCREL_S2, BFD_RELOC_HI16_S_PCREL and
  BFD_RELOC_LO16_PCREL.
  * elf64-mips.c: Define REL, and RELA relocations R_MIPS_PC21_S2,
R_MIPS_PC26_S2, R_MIPS_PC18_S3, R_MIPS_PC19_S2, R_MIPS_PCHI16
and R_MIPS_PCLO16.
  (mips_reloc_map): Add entries for BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2, BFD_RELOC_MIPS_18_PCREL_S3,
  BFD_RELOC_MIPS_19_PCREL_S2, BFD_RELOC_HI16_S_PCREL and
  BFD_RELOC_LO16_PCREL.
  * elfn32-mips.c: Likewise.
  * elfxx-mips.c (MIPSR6_P): New define.
  (mipsr6_exec_plt_entry): New array.
(hi16_reloc_p): Add support for R_MIPS_PCHI16.
(lo16_reloc_p): Add support for R_MIPS_PCLO16.
  (aligned_pcrel_reloc_p): New function.
  (mips_elf_relocation_needs_la25_stub): Add support for relocs:
  R_MIPS_PC21_S2 and R_MIPS_PC26_S2.
  (mips_elf_calculate_relocation): Add support for relocs:
  R_MIPS_PC21_S2, R_MIPS_PC26_S2, R_MIPS_PC18_S3, R_MIPS_PC19_S2,
  R_MIPS_PCHI16 and R_MIPS_PCLO16.
  (_bfd_elf_mips_mach): Add support for mips32r6 and mips64r6.
(mips_elf_add_lo16_rel_addend): Add support for R_MIPS_PCHI16.
  (_bfd_mips_elf_check_relocs): Add support for relocs:
R_MIPS_PC21_S2 and R_MIPS_PC26_S2.
  (_bfd_mips_elf_relocate_section): Add a check for unaligned
  pc relative relocs.
  (_bfd_mips_elf_finish_dynamic_symbol): Add support for MIPS r6
  plt entry.
  (mips_set_isa_flags): Add support for mips32r6 and mips64r6.
  (_bfd_mips_elf_print_private_bfd_data): Likewise.
  (mips_32bit_flags_p): Add support for mips32r6.
  * libbfd.h (bfd_reloc_code_real_names): Add entries for
  BFD_RELOC_MIPS_21_PCREL_S2, BFD_RELOC_MIPS_26_PCREL_S2,
  BFD_RELOC_MIPS_18_PCREL_S3 and BFD_RELOC_MIPS_19_PCREL_S2.
  * reloc.c: Document relocs BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2, BFD_RELOC_MIPS_18_PCREL_S3 and
  BFD_RELOC_MIPS_19_PCREL_S2.

binutils/
  * readelf.c (get_machine_flags): Add support for mips32r6 and
  mips64r6.

elfcpp/
  * mips.h (E_MIPS_ARCH_32R6, E_MIPS_ARCH_64R6): New enum constants.

gas/
  * config/tc-mips.c (mips_nan2008): New static global.
(mips_flag_nan2008): Removed.
(LL_SC_FMT): New define.
(COP12_FMT): Updated.
(ISA_IS_R6): New define.
  (ISA_HAS_64BIT_REGS): Add mips64r6.
  (ISA_HAS_DROR): Likewise.
  (ISA_HAS_64BIT_FPRS): Add mips32r6 and mips64r6.
  (ISA_HAS_ROR): Likewise.
  (ISA_HAS_ODD_SINGLE_FPR): Likewise.
  (ISA_HAS_MXHC1): Likewise.
  (hilo_interlocks): Likewise.
  (md_longopts): Likewise.
(ISA_HAS_LEGACY_NAN): New define.
  (options): Add OPTION_MIPS32R6 and OPTION_MIPS64R6.
  (mips_ase): Add field rem_rev.
  (mips_ases): Updated to add which ISA an ASE was removed in.
  (mips_isa_rev): Add support for mips32r6 and mips64r6.
  (mips_check_isa_supports_ase): Add support to check if an ASE
  has been removed in the specified MIPS ISA revision.
  (validate_mips_insn): Skip '-' character.
(macro_build): Likewise.
(mips_check_options): Prevent R6 working with fp32, mips16,
micromips, or branch relaxation.
(file_mips_check_options): Set R6 floating point registers to
64 bit.  Also deal with the nan2008 option.
  (limited_pcrel_reloc_p): Add relocs: BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2, BFD_RELOC_MIPS_18_PCREL_S3,
  BFD_RELOC_MIPS_19_PCREL_S2, BFD_RELOC_HI16_S_PCREL and
  BFD_RELOC_LO16_PCREL.
  (operand_reg_mask): Add support for OP_SAME_RS_RT, OP_CHECK_PREV
and OP_NON_ZERO_REG.
  (match_check_prev_operand): New static function.
  (match_same_rs_rt_operand): New static function.
(match_non_zero_reg_operand): New static function.
  (match_operand): Added entries for: OP_SAME_RS_RT, OP_CHECK_PREV
and OP_NON_ZERO_REG.
  (insns_between): Added case to deal with forbidden slots.
  (append_insn): Added support for relocs: BFD_RELOC_MIPS_21_PCREL_S2
  and BFD_RELOC_MIPS_26_PCREL_S2.
  (match_insn): Add support for operands -A, -B, +' and +".  Also
  skip '-' character.
  (mips_percent_op): Add entries for %pcrel_hi and %pcrel_lo.
  (md_parse_option): Add support for mips32r6 and mips64r6.  Also
update the nan option handling.
  (md_pcrel_from): Add cases for relocs: BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2.
  (mips_force_relocation): Prevent forced relaxation for MIPS r6.
  (md_apply_fix): Add support for relocs: BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2, BFD_RELOC_MIPS_18_PCREL_S3,
  BFD_RELOC_MIPS_19_PCREL_S2, BFD_RELOC_HI16_S_PCREL and
  BFD_RELOC_LO16_PCREL.
  (s_mipsset): Add support for mips32r6 and mips64r6.
(s_nan): Update to support the new nan2008 framework.
  (tc_gen_reloc): Add relocs: BFD_RELOC_MIPS_21_PCREL_S2,
  BFD_RELOC_MIPS_26_PCREL_S2, BFD_RELOC_MIPS_18_PCREL_S3,
  BFD_RELOC_MIPS_19_PCREL_S2, BFD_RELOC_HI16_S_PCREL and
  BFD_RELOC_LO16_PCREL.
(mips_elf_final_processing): Updated to use the mips_nan2008.
  (mips_cpu_info_table): Add entries for mips32r6 and mips64r6.
(macro): Enable ldc2, sdc2, ll, lld, swc2, sc, scd, cache, pref
macros for R6.
(mips_fix_adjustable): Make PC relative R6 relocations relative
to the symbol and not the section.
  * configure.ac: Add support for mips32r6 and mips64r6.
  * configure: Regenerate.
  * doc/c-mips.texi: Document the -mips32r6 and -mips64r6 command line
  options.
* doc/as.texinfo: Likewise.

gas/testsuite/
* gas/mips/24k-triple-stores-1.s: If testing for r6 prevent
non-supported instructions from being tested.
* gas/mips/24k-triple-stores-2.s: Likewise.
* gas/mips/24k-triple-stores-3.s: Likewise.
* gas/mips/24k-triple-stores-6.s: Likewise.
* gas/mips/beq.s: Likewise.
* gas/mips/eva.s: Likewise.
* gas/mips/ld-zero-3.s: Likewise.
* gas/mips/mips32-cp2.s: Likewise.
* gas/mips/mips32.s: Likewise.
* gas/mips/mips4.s: Likewise.
* gas/mips/add.s: Don't test the add instructions if r6, and
add padding.
* gas/mips/add.d: Check for a triple dot not a nop at the end of the
disassembly output.
* gas/mips/micromips@add.d: Likewise.
* gas/mips/mipsr6@24k-branch-delay-1.d: New file.
* gas/mips/mipsr6@24k-triple-stores-1.d: New file.
* gas/mips/mipsr6@24k-triple-stores-2-llsc.d: New file.
* gas/mips/mipsr6@24k-triple-stores-2.d: New file.
* gas/mips/mipsr6@24k-triple-stores-3.d: New file.
* gas/mips/mipsr6@24k-triple-stores-6.d: New file.
* gas/mips/mipsr6@add.d: New file.
* gas/mips/mipsr6@attr-gnu-4-1-msingle-float.l: New file.
* gas/mips/mipsr6@attr-gnu-4-1-msingle-float.s: New file.
* gas/mips/mipsr6@attr-gnu-4-1-msoft-float.l: New file.
* gas/mips/mipsr6@attr-gnu-4-1-msoft-float.s: New file.
* gas/mips/mipsr6@attr-gnu-4-2-mdouble-float.l: New file.
* gas/mips/mipsr6@attr-gnu-4-2-mdouble-float.s: New file.
* gas/mips/mipsr6@beq.d: New file.
* gas/mips/mipsr6@bge.d: New file.
* gas/mips/mipsr6@bgeu.d: New file.
* gas/mips/mipsr6@blt.d: New file.
* gas/mips/mipsr6@bltu.d: New file.
* gas/mips/mipsr6@branch-misc-1.d: New file.
* gas/mips/mipsr6@branch-misc-2-64.d: New file.
* gas/mips/mipsr6@branch-misc-2pic-64.d: New file.
* gas/mips/mipsr6@branch-misc-4-64.d: New file.
* gas/mips/mipsr6@cache.d: New file.
* gas/mips/mipsr6@eva.d: New file.
* gas/mips/mipsr6@jal-svr4pic-noreorder.d: New file.
* gas/mips/mipsr6@jal-svr4pic.d: New file.
* gas/mips/mipsr6@ld-zero-2.d: New file.
* gas/mips/mipsr6@ld-zero-3.d: New file.
* gas/mips/mipsr6@loc-swap-dis.d: New file.
* gas/mips/mipsr6@mips32-cp2.d: New file.
* gas/mips/mipsr6@mips32-imm.d: New file.
* gas/mips/mipsr6@mips32.d: New file.
* gas/mips/mipsr6@mips32r2.d: New file.
* gas/mips/mipsr6@mips4-fp.d: New file.
* gas/mips/mipsr6@mips4-fp.l: New file.
* gas/mips/mipsr6@mips4-fp.s: New file.
* gas/mips/mipsr6@mips4.d: New file.
* gas/mips/mipsr6@mips5-fp.d: New file.
* gas/mips/mipsr6@mips5-fp.l: New file.
* gas/mips/mipsr6@mips5-fp.s: New file.
* gas/mips/mipsr6@mips64.d: New file.
* gas/mips/mipsr6@msa-branch.d: New file.
* gas/mips/mipsr6@msa.d: New file.
* gas/mips/mipsr6@pref.d: New file.
* gas/mips/mipsr6@relax-swap3.d: New file.
* gas/mips/r6-64-n32.d: New file.
* gas/mips/r6-64-n64.d: New file.
* gas/mips/r6-64-removed.l: New file.
* gas/mips/r6-64-removed.s: New file.
* gas/mips/r6-64.s: New file.
* gas/mips/r6-attr-none-double.d: New file.
* gas/mips/r6-n32.d: New file.
* gas/mips/r6-n64.d: New file.
* gas/mips/r6-removed.l: New file.
* gas/mips/r6-removed.s: New file.
* gas/mips/r6.d: New file.
* gas/mips/r6.s: New file.
* gas/mips/mipsr6@mips32-dsp.d: New file.
* gas/mips/mipsr6@mips32-dspr2.d: New file.
* gas/mips/mipsr6@mips32r2-ill.l: New file.
* gas/mips/mipsr6@mips32r2-ill.s: New file.
* gas/mips/cache.s: Add r6 instruction varients.
* gas/mips/mips.exp: Add support for the mips32r6 and mips64r6
architectures.  Also prevent non r6 supported tests from running.
Finally, add in support for running the new r6 tests.
(run_dump_test_arch): Add support for mipsr6 tests.
(run_list_test_arch): Add support for using files of the
form arch@testname.l .

include/elf/
  * mips.h: Add relocs: R_MIPS_PC21_S2, R_MIPS_PC26_S2, R_MIPS_PC18_S3,
  R_MIPS_PC19_S2, R_MIPS_PCHI16 and R_MIPS_PCLO16.
  (E_MIPS_ARCH_32R6): New define.
  (E_MIPS_ARCH_64R6): New define.

include/opcode/
  * mips.h (mips_operand_type): Add new entries: OP_SAME_RS_RT,
  OP_CHECK_PREV and OP_NON_ZERO_REG.  Add descriptions for the MIPS R6
instruction arguments: -a, -b, -d, -s, -t, -u, -v, -w, -x, -y, -A, -B,
 +I, +O, +R, +:, +\, +", +;
(mips_check_prev_operand): New struct.
  (INSN2_FORBIDDEN_SLOT): New define.
  (INSN_ISA32R6): New define.
  (INSN_ISA64R6): New define.
(INSN_UPTO32R6): New define.
(INSN_UPTO64R6): New define.
(mips_isa_table): Add INSN_UPTO32R6 and INSN_UPTO64R6.
  (ISA_MIPS32R6): New define.
  (ISA_MIPS64R6): New define.
  (CPU_MIPS32R6): New define.
  (CPU_MIPS64R6): New define.
  (cpu_is_member): Add cases for CPU_MIPS32R6, and CPU_MIPS64R6.

ld/
  * ldmain.c (get_emulation): Add support for -mips32r6 and -mips64r6.

opcodes/
  * mips-dis.c (mips_arch_choices): Add entries for mips32r6 and
  mips64r6.
  (parse_mips_dis_option): Allow MSA and virtualization support for
  mips64r6.
  (mips_print_arg_state): Add fields dest_regno and seen_dest.
  (mips_seen_register): New function.
  (print_insn_arg): Refactored code to use mips_seen_register
function.  Add support for OP_SAME_RS_RT, OP_CHECK_PREV and
OP_NON_ZERO_REG.  Changed OP_REPEAT_DEST_REG case to print out
the register rather than aborting.
  (print_insn_args): Add length argument.  Add code to correctly
calculate the instruction address for pc relative instructions.
(validate_insn_args): New static function.
  (print_insn_mips): Prevent jalx disassembling for r6.  Use
validate_insn_args.
(print_insn_micromips): Use validate_insn_args.
all the arguments are valid.
* mips-formats.h (PREV_CHECK): New define.
  * mips-opc.c (decode_mips_operand): Add support for -a, -b, -d, -s,
  -t, -u, -v, -w, -x, -y, -A, -B, +I, +O, +R, +:, +\, +", +;
  (RD_pc): New define.
  (FS): New define.
  (I37): New define.
  (I69): New define.
  (mips_builtin_opcodes): Add MIPS R6 instructions.  Exclude recoded
  MIPS R6 instructions from MIPS R2 instructions.
107 files changed:
bfd/ChangeLog
bfd/aoutx.h
bfd/archures.c
bfd/bfd-in2.h
bfd/cpu-mips.c
bfd/elf32-mips.c
bfd/elf64-mips.c
bfd/elfn32-mips.c
bfd/elfxx-mips.c
bfd/libbfd.h
bfd/reloc.c
binutils/ChangeLog
binutils/readelf.c
elfcpp/ChangeLog
elfcpp/mips.h
gas/ChangeLog
gas/config/tc-mips.c
gas/configure
gas/configure.ac
gas/doc/as.texinfo
gas/doc/c-mips.texi
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/24k-triple-stores-1.s
gas/testsuite/gas/mips/24k-triple-stores-2.s
gas/testsuite/gas/mips/24k-triple-stores-3.s
gas/testsuite/gas/mips/24k-triple-stores-6.s
gas/testsuite/gas/mips/add.d
gas/testsuite/gas/mips/add.s
gas/testsuite/gas/mips/beq.s
gas/testsuite/gas/mips/cache.s
gas/testsuite/gas/mips/eva.s
gas/testsuite/gas/mips/micromips@add.d
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips32-cp2.s
gas/testsuite/gas/mips/mips32.s
gas/testsuite/gas/mips/mips4.s
gas/testsuite/gas/mips/mipsr6@24k-branch-delay-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@24k-triple-stores-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@24k-triple-stores-2-llsc.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@24k-triple-stores-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@24k-triple-stores-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@24k-triple-stores-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@add.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@attr-gnu-4-1-msingle-float.l [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@attr-gnu-4-1-msingle-float.s [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@attr-gnu-4-1-msoft-float.l [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@attr-gnu-4-1-msoft-float.s [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@attr-gnu-4-2-mdouble-float.l [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@attr-gnu-4-2-mdouble-float.s [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@beq.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@bge.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@bgeu.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@blt.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@bltu.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@branch-misc-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@branch-misc-2-64.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@branch-misc-2pic-64.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@branch-misc-4-64.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@cache.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@eva.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@jal-svr4pic-noreorder.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@jal-svr4pic.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@ld-zero-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@ld-zero-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@loc-swap-dis.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32-cp2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32-dsp.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32-dspr2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32-imm.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32r2-ill.l [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32r2-ill.s [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips32r2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips4-fp.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips4-fp.l [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips4-fp.s [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips5-fp.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips5-fp.l [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips5-fp.s [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@mips64.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@msa-branch.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@msa.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@pref.d [new file with mode: 0644]
gas/testsuite/gas/mips/mipsr6@relax-swap3.d [new file with mode: 0644]
gas/testsuite/gas/mips/r6-64-n32.d [new file with mode: 0644]
gas/testsuite/gas/mips/r6-64-n64.d [new file with mode: 0644]
gas/testsuite/gas/mips/r6-64-removed.l [new file with mode: 0644]
gas/testsuite/gas/mips/r6-64-removed.s [new file with mode: 0644]
gas/testsuite/gas/mips/r6-64.s [new file with mode: 0644]
gas/testsuite/gas/mips/r6-attr-none-double.d [new file with mode: 0644]
gas/testsuite/gas/mips/r6-n32.d [new file with mode: 0644]
gas/testsuite/gas/mips/r6-n64.d [new file with mode: 0644]
gas/testsuite/gas/mips/r6-removed.l [new file with mode: 0644]
gas/testsuite/gas/mips/r6-removed.s [new file with mode: 0644]
gas/testsuite/gas/mips/r6.d [new file with mode: 0644]
gas/testsuite/gas/mips/r6.s [new file with mode: 0644]
include/elf/ChangeLog
include/elf/mips.h
include/opcode/ChangeLog
include/opcode/mips.h
ld/ChangeLog
ld/ldmain.c
opcodes/ChangeLog
opcodes/mips-dis.c
opcodes/mips-formats.h
opcodes/mips-opc.c