This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: [PATCH] Add support for MIPS64r6


Andrew Bennett <Andrew.Bennett@imgtec.com> writes:
> 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.
> 	(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.

FWIW I have done a review on this code prior to it being sent to the list
and several minor issues have been corrected.  We have had the previous
version of this patch in use for internal R6 development for some time
now and this update addresses a couple of minor issues discovered during
general use. The only serious issue was the lack of macro support for the
reduced displacement fields in instructions like LL/CACHE/PREF etc where
GCC inline ASM using the 'm' constraint would lead to the compiler
assuming support for base+16bit displacement. Micromips relies on the same
solution so this is at least consistent with how reduced displacements
have been handled previously.

Thanks,
Matthew


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]