MIPS32R6 and MIPS64R6 support

gcc/

	* config.gcc: Add mipsisa64r6 and mipsisa32r6 cpu support.
	* config/mips/constraints.md (ZD): Add r6 restrictions.
	* config/mips/gnu-user.h (DRIVER_SELF_SPECS): Add MIPS_ISA_LEVEL_SPEC.
	* config/mips/loongson.md
	(<u>div<mode>3, <u>mod<mode>3): Move to mips.md.
	* config/mips/mips-cpus.def (mips32r6, mips64r6): Define.
	* config/mips/mips-modes.def (CCF): New mode.
	* config/mips/mips-protos.h
	(mips_9bit_offset_address_p): New prototype.
	* config/mips/mips-tables.opt: Regenerate.
	* config/mips/mips.c (MIPS_JR): Use JALR $, <reg> for R6.
	(mips_rtx_cost_data): Add pseudo-processors W32 and W64.
	(mips_9bit_offset_address_p): New function.
	(mips_rtx_costs): Account for R6 multiply and FMA instructions.
	(mips_emit_compare): Implement R6 FPU comparisons.
	(mips_expand_conditional_move): Implement R6 selects.
	(mips_expand_conditional_trap): Account for removed trap immediate.
	(mips_expand_block_move): Disable inline move when LWL/LWR are removed.
	(mips_print_float_branch_condition): Update for R6 FPU branches.
	(mips_print_operand): Handle CCF mode compares.
	(mips_interrupt_extra_call_saved_reg_p): Do not attempt to callee-save
	MD_REGS for R6.
	(mips_hard_regno_mode_ok_p): Support CCF mode.
	(mips_mode_ok_for_mov_fmt_p): Likewise.
	(mips_secondary_reload_class): CCFmode can be loaded directly.
	(mips_set_fast_mult_zero_zero_p): Account for R6 multiply instructions.
	(mips_option_override): Ensure R6 is used with fp64.  Set default
	mips_nan modes.  Check for mips_nan support.  Prevent DSP with R6.
	(mips_conditional_register_usage): Disable MD_REGS for R6. Disable
	FPSW for R6.
	(mips_mulsidi3_gen_fn): Support R6 multiply instructions.
	* config/mips/mips.h (ISA_MIPS32R6, ISA_MIPS64R6): Define.
	(TARGET_CPU_CPP_BUILTINS): Rework for mips32/mips64.
	(ISA_HAS_JR): New macro.
	(ISA_HAS_HILO): New macro.
	(ISA_HAS_R6MUL): Likewise.
	(ISA_HAS_R6DMUL): Likewise.
	(ISA_HAS_R6DIV): Likewise.
	(ISA_HAS_R6DDIV): Likewise.
	(ISA_HAS_CCF): Likewise.
	(ISA_HAS_SEL): Likewise.
	(ISA_HAS_COND_TRAPI): Likewise.
	(ISA_HAS_FP_MADDF_MSUBF): Likewise.
	(ISA_HAS_LWL_LWR): Likewise.
	(ISA_HAS_IEEE_754_LEGACY): Likewise.
	(ISA_HAS_IEEE_754_2008): Likewise.
	(ISA_HAS_PREFETCH_9BIT): Likewise.
	(MIPSR6_9BIT_OFFSET_P): New macro.
	(BASE_DRIVER_SELF_SPECS): Use MIPS_ISA_DRIVER_SELF_SPECS.
	(DRIVER_SELF_SPECS): Use MIPS_ISA_LEVEL_SPEC.
	(MULTILIB_ISA_DEFAULT): Handle mips32r6 and mips64r6.
	(MIPS_ISA_LEVEL_SPEC): Likewise.
	(MIPS_ISA_SYNCI_SPEC): Likewise.
	(ISA_HAS_64BIT_REGS): Likewise.
	(ISA_HAS_BRANCHLIKELY): Likewise.
	(ISA_HAS_MUL3): Likewise.
	(ISA_HAS_DMULT): Likewise.
	(ISA_HAS_DDIV): Likewise.
	(ISA_HAS_DIV): Likewise.
	(ISA_HAS_MULT): Likewise.
	(ISA_HAS_FP_CONDMOVE): Likewise.
	(ISA_HAS_8CC): Likewise.
	(ISA_HAS_FP4): Likewise.
	(ISA_HAS_PAIRED_SINGLE): Likewise.
	(ISA_HAS_MADD_MSUB): Likewise.
	(ISA_HAS_FP_RECIP_RSQRT): Likewise.
	* config/mips/mips.md (processor): Add w32 and w64.
	(FPCC): New mode iterator.
	(reg): Add CCF mode.
	(fpcmp): New mode attribute.
	(fcond): Add ordered, ltgt and ne codes.
	(fcond): Update code attribute.
	(sel): New code attribute.
	(selinv): Likewise.
	(ctrap<mode>4): Update condition.
	(*conditional_trap_reg<mode>): New define_insn.
	(*conditional_trap<mode>): Update condition.
	(mul<mode>3): Expand R6 multiply instructions.
	(<su>mulsi3_highpart): Likewise.
	(<su>muldi3_highpart): Likewise.
	(mul<mode>3_mul3_loongson): Rename...
	(mul<mode>3_mul3_hilo): To this.  Add R6 mul instruction.
	(<u>mulsidi3_32bit_r6): New expander.
	(<u>mulsidi3_32bit): Restrict to pre-r6 multiplies.
	(<u>mulsidi3_32bit_r4000): Likewise.
	(<u>mulsidi3_64bit): Likewise.
	(<su>mulsi3_highpart_internal): Likewise.
	(mulsidi3_64bit_r6dmul): New instruction.
	(<su>mulsi3_highpart_r6): Likewise.
	(<su>muldi3_highpart_r6): Likewise.
	(fma<mode>4): Likewise.
	(movccf): Likewise.
	(*sel<code><GPR:mode>_using_<GPR2:mode>): Likewise.
	(*sel<mode>): Likewise.
	(<u>div<mode>3): Moved from loongson.md.  Add R6 instructions.
	(<u>mod<mode>3): Likewise.
	(extvmisalign<mode>): Require ISA_HAS_LWL_LWR.
	(extzvmisalign<mode>): Likewise.
	(insvmisalign<mode>): Likewise.
	(mips_cache): Account for R6 displacement field sizes.
	(*branch_fp): Rename...
	(*branch_fp_<mode>): To this.  Add CCFmode support.
	(*branch_fp_inverted): Rename...
	(*branch_fp_inverted_<mode>): To this.  Add CCFmode support.
	(s<code>_<mode>): Rename...
	(s<code>_<SCALARF:mode>_using_<FPCC:mode>): To this.  Add FCCmode
	condition support.
	(s<code>_<mode> swapped): Rename...
	(s<code>_<SCALARF:mode>_using_<FPCC:mode> swapped): To this. Add
	CCFmode condition support.
	(mov<mode>cc GPR): Expand R6 selects.
	(mov<mode>cc FPR): Expand R6 selects.
	(*tls_get_tp_<mode>_split): Do not .set push for >= mips32r2.
	* config/mips/netbsd.h (TARGET_CPU_CPP_BUILTINS): Update similarly to
	mips.h.
	(ASM_SPEC): Add mips32r6, mips64r6.
	* config/mips/t-isa3264 (MULTILIB_OPTIONS, MULTILIB_DIRNAMES): Update
	for mips32r6/mips64r6.
	* doc/invoke.texi: Document -mips32r6,-mips64r6.
	* doc/md.texi: Update comment for ZD constraint.

libgcc/

	* config.host: Support mipsisa32r6 and mipsisa64r6.
	* config/mips/mips16.S: Do not build for R6.

gcc/testsuite/

	* gcc.dg/torture/mips-hilo-2.c: Unconditionally pass for R6 onwards.
	* gcc.dg/torture/pr19683-1.c: Likewise.
	* gcc.target/mips/branch-cost-2.c: Require MOVN.
	* gcc.target/mips/movcc-1.c: Likewise.
	* gcc.target/mips/movcc-2.c: Likewise.
	* gcc.target/mips/movcc-3.c: Likewise.
	* gcc.target/mips/call-saved-4.c: Require LDC.
	* gcc.target/mips/dmult-1.c: Require R5 or earlier.
	* gcc.target/mips/fpcmp-1.c: Likewise.
	* gcc.target/mips/fpcmp-2.c: Likewise.
	* gcc.target/mips/neg-abs-2.c: Likewise.
	* gcc.target/mips/timode-1.c: Likewise.
	* gcc.target/mips/unaligned-1.c: Likewise.
	* gcc.target/mips/madd-3.c: Require MADD.
	* gcc.target/mips/madd-9.c: Likewise.
	* gcc.target/mips/maddu-3.c: Likewise.
	* gcc.target/mips/msub-3.c: Likewise.
	* gcc.target/mips/msubu-3.c: Likewise.
	* gcc.target/mips/mult-1.c: Require INS and not DMUL.
	* gcc.target/mips/mips-ps-type-2.c: Require MADD.PS.
	* gcc.target/mips/mips.exp (mips_option_groups): Add ins, dmul, ldc,
	movn, madd, maddps.
	(mips-dg-options): INS available from R2.  LDC available from MIPS II,
	DMUL is present in octeon.  Describe all features removed from R6.

Co-Authored-By: Steve Ellcey <sellcey@imgtec.com>

From-SVN: r218973
This commit is contained in:
Matthew Fortune 2014-12-19 20:17:36 +00:00 committed by Matthew Fortune
parent 5afd44e33b
commit 82f84ecbb4
42 changed files with 1095 additions and 403 deletions

View File

@ -1,3 +1,126 @@
2014-12-19 Matthew Fortune <matthew.fortune@imgtec.com>
* config.gcc: Add mipsisa64r6 and mipsisa32r6 cpu support.
* config/mips/constraints.md (ZD): Add r6 restrictions.
* config/mips/gnu-user.h (DRIVER_SELF_SPECS): Add MIPS_ISA_LEVEL_SPEC.
* config/mips/loongson.md
(<u>div<mode>3, <u>mod<mode>3): Move to mips.md.
* config/mips/mips-cpus.def (mips32r6, mips64r6): Define.
* config/mips/mips-modes.def (CCF): New mode.
* config/mips/mips-protos.h
(mips_9bit_offset_address_p): New prototype.
* config/mips/mips-tables.opt: Regenerate.
* config/mips/mips.c (MIPS_JR): Use JALR $, <reg> for R6.
(mips_rtx_cost_data): Add pseudo-processors W32 and W64.
(mips_9bit_offset_address_p): New function.
(mips_rtx_costs): Account for R6 multiply and FMA instructions.
(mips_emit_compare): Implement R6 FPU comparisons.
(mips_expand_conditional_move): Implement R6 selects.
(mips_expand_conditional_trap): Account for removed trap immediate.
(mips_expand_block_move): Disable inline move when LWL/LWR are removed.
(mips_print_float_branch_condition): Update for R6 FPU branches.
(mips_print_operand): Handle CCF mode compares.
(mips_interrupt_extra_call_saved_reg_p): Do not attempt to callee-save
MD_REGS for R6.
(mips_hard_regno_mode_ok_p): Support CCF mode.
(mips_mode_ok_for_mov_fmt_p): Likewise.
(mips_secondary_reload_class): CCFmode can be loaded directly.
(mips_set_fast_mult_zero_zero_p): Account for R6 multiply instructions.
(mips_option_override): Ensure R6 is used with fp64. Set default
mips_nan modes. Check for mips_nan support. Prevent DSP with R6.
(mips_conditional_register_usage): Disable MD_REGS for R6. Disable
FPSW for R6.
(mips_mulsidi3_gen_fn): Support R6 multiply instructions.
* config/mips/mips.h (ISA_MIPS32R6, ISA_MIPS64R6): Define.
(TARGET_CPU_CPP_BUILTINS): Rework for mips32/mips64.
(ISA_HAS_JR): New macro.
(ISA_HAS_HILO): New macro.
(ISA_HAS_R6MUL): Likewise.
(ISA_HAS_R6DMUL): Likewise.
(ISA_HAS_R6DIV): Likewise.
(ISA_HAS_R6DDIV): Likewise.
(ISA_HAS_CCF): Likewise.
(ISA_HAS_SEL): Likewise.
(ISA_HAS_COND_TRAPI): Likewise.
(ISA_HAS_FP_MADDF_MSUBF): Likewise.
(ISA_HAS_LWL_LWR): Likewise.
(ISA_HAS_IEEE_754_LEGACY): Likewise.
(ISA_HAS_IEEE_754_2008): Likewise.
(ISA_HAS_PREFETCH_9BIT): Likewise.
(MIPSR6_9BIT_OFFSET_P): New macro.
(BASE_DRIVER_SELF_SPECS): Use MIPS_ISA_DRIVER_SELF_SPECS.
(DRIVER_SELF_SPECS): Use MIPS_ISA_LEVEL_SPEC.
(MULTILIB_ISA_DEFAULT): Handle mips32r6 and mips64r6.
(MIPS_ISA_LEVEL_SPEC): Likewise.
(MIPS_ISA_SYNCI_SPEC): Likewise.
(ISA_HAS_64BIT_REGS): Likewise.
(ISA_HAS_BRANCHLIKELY): Likewise.
(ISA_HAS_MUL3): Likewise.
(ISA_HAS_DMULT): Likewise.
(ISA_HAS_DDIV): Likewise.
(ISA_HAS_DIV): Likewise.
(ISA_HAS_MULT): Likewise.
(ISA_HAS_FP_CONDMOVE): Likewise.
(ISA_HAS_8CC): Likewise.
(ISA_HAS_FP4): Likewise.
(ISA_HAS_PAIRED_SINGLE): Likewise.
(ISA_HAS_MADD_MSUB): Likewise.
(ISA_HAS_FP_RECIP_RSQRT): Likewise.
* config/mips/mips.md (processor): Add w32 and w64.
(FPCC): New mode iterator.
(reg): Add CCF mode.
(fpcmp): New mode attribute.
(fcond): Add ordered, ltgt and ne codes.
(fcond): Update code attribute.
(sel): New code attribute.
(selinv): Likewise.
(ctrap<mode>4): Update condition.
(*conditional_trap_reg<mode>): New define_insn.
(*conditional_trap<mode>): Update condition.
(mul<mode>3): Expand R6 multiply instructions.
(<su>mulsi3_highpart): Likewise.
(<su>muldi3_highpart): Likewise.
(mul<mode>3_mul3_loongson): Rename...
(mul<mode>3_mul3_hilo): To this. Add R6 mul instruction.
(<u>mulsidi3_32bit_r6): New expander.
(<u>mulsidi3_32bit): Restrict to pre-r6 multiplies.
(<u>mulsidi3_32bit_r4000): Likewise.
(<u>mulsidi3_64bit): Likewise.
(<su>mulsi3_highpart_internal): Likewise.
(mulsidi3_64bit_r6dmul): New instruction.
(<su>mulsi3_highpart_r6): Likewise.
(<su>muldi3_highpart_r6): Likewise.
(fma<mode>4): Likewise.
(movccf): Likewise.
(*sel<code><GPR:mode>_using_<GPR2:mode>): Likewise.
(*sel<mode>): Likewise.
(<u>div<mode>3): Moved from loongson.md. Add R6 instructions.
(<u>mod<mode>3): Likewise.
(extvmisalign<mode>): Require ISA_HAS_LWL_LWR.
(extzvmisalign<mode>): Likewise.
(insvmisalign<mode>): Likewise.
(mips_cache): Account for R6 displacement field sizes.
(*branch_fp): Rename...
(*branch_fp_<mode>): To this. Add CCFmode support.
(*branch_fp_inverted): Rename...
(*branch_fp_inverted_<mode>): To this. Add CCFmode support.
(s<code>_<mode>): Rename...
(s<code>_<SCALARF:mode>_using_<FPCC:mode>): To this. Add FCCmode
condition support.
(s<code>_<mode> swapped): Rename...
(s<code>_<SCALARF:mode>_using_<FPCC:mode> swapped): To this. Add
CCFmode condition support.
(mov<mode>cc GPR): Expand R6 selects.
(mov<mode>cc FPR): Expand R6 selects.
(*tls_get_tp_<mode>_split): Do not .set push for >= mips32r2.
* config/mips/netbsd.h (TARGET_CPU_CPP_BUILTINS): Update similarly to
mips.h.
(ASM_SPEC): Add mips32r6, mips64r6.
* config/mips/t-isa3264 (MULTILIB_OPTIONS, MULTILIB_DIRNAMES): Update
for mips32r6/mips64r6.
* doc/invoke.texi: Document -mips32r6,-mips64r6.
* doc/md.texi: Update comment for ZD constraint.
2014-12-19 Segher Boessenkool <segher@kernel.crashing.org>
PR target/64268

View File

@ -1973,6 +1973,9 @@ mips*-*-linux*) # Linux MIPS, either endian.
tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h"
extra_options="${extra_options} linux-android.opt"
case ${target} in
mipsisa32r6*)
default_mips_arch=mips32r6
;;
mipsisa32r2*)
default_mips_arch=mips32r2
;;
@ -1991,6 +1994,11 @@ mips*-*-linux*) # Linux MIPS, either endian.
target_cpu_default=MASK_SOFT_FLOAT_ABI
enable_mips_multilibs="yes"
;;
mipsisa64r6*-*-linux*)
default_mips_abi=n32
default_mips_arch=mips64r6
enable_mips_multilibs="yes"
;;
mipsisa64r2*-*-linux*)
default_mips_abi=n32
default_mips_arch=mips64r2
@ -2033,12 +2041,18 @@ mips*-sde-elf*)
;;
esac
case ${target} in
mipsisa32r6*)
tm_defines="MIPS_ISA_DEFAULT=37 MIPS_ABI_DEFAULT=ABI_32"
;;
mipsisa32r2*)
tm_defines="MIPS_ISA_DEFAULT=33 MIPS_ABI_DEFAULT=ABI_32"
;;
mipsisa32*)
tm_defines="MIPS_ISA_DEFAULT=32 MIPS_ABI_DEFAULT=ABI_32"
;;
mipsisa64r6*)
tm_defines="MIPS_ISA_DEFAULT=69 MIPS_ABI_DEFAULT=ABI_N32"
;;
mipsisa64r2*)
tm_defines="MIPS_ISA_DEFAULT=65 MIPS_ABI_DEFAULT=ABI_N32"
;;
@ -2049,17 +2063,25 @@ mips*-sde-elf*)
;;
mipsisa32-*-elf* | mipsisa32el-*-elf* | \
mipsisa32r2-*-elf* | mipsisa32r2el-*-elf* | \
mipsisa32r6-*-elf* | mipsisa32r6el-*-elf* | \
mipsisa64-*-elf* | mipsisa64el-*-elf* | \
mipsisa64r2-*-elf* | mipsisa64r2el-*-elf*)
mipsisa64r2-*-elf* | mipsisa64r2el-*-elf* | \
mipsisa64r6-*-elf* | mipsisa64r6el-*-elf*)
tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h"
tmake_file="mips/t-isa3264"
case ${target} in
mipsisa32r6*)
tm_defines="${tm_defines} MIPS_ISA_DEFAULT=37"
;;
mipsisa32r2*)
tm_defines="${tm_defines} MIPS_ISA_DEFAULT=33"
;;
mipsisa32*)
tm_defines="${tm_defines} MIPS_ISA_DEFAULT=32"
;;
mipsisa64r6*)
tm_defines="${tm_defines} MIPS_ISA_DEFAULT=69"
;;
mipsisa64r2*)
tm_defines="${tm_defines} MIPS_ISA_DEFAULT=65"
;;
@ -4192,8 +4214,10 @@ case ${target} in
mips4) tm_defines="$tm_defines MIPS_ISA_DEFAULT=4" ;;
mips32) tm_defines="$tm_defines MIPS_ISA_DEFAULT=32" ;;
mips32r2) tm_defines="$tm_defines MIPS_ISA_DEFAULT=33" ;;
mips32r6) tm_defines="$tm_defines MIPS_ISA_DEFAULT=37" ;;
mips64) tm_defines="$tm_defines MIPS_ISA_DEFAULT=64" ;;
mips64r2) tm_defines="$tm_defines MIPS_ISA_DEFAULT=65" ;;
mips64r6) tm_defines="$tm_defines MIPS_ISA_DEFAULT=69" ;;
esac
case ${default_mips_abi} in
32) tm_defines="$tm_defines MIPS_ABI_DEFAULT=ABI_32" ;;

View File

@ -321,13 +321,13 @@
(match_test "mips_address_insns (XEXP (op, 0), mode, false)"))))
(define_address_constraint "ZD"
"When compiling microMIPS code, this constraint matches an address operand
that is formed from a base register and a 12-bit offset. These operands
can be used for microMIPS instructions such as @code{prefetch}. When
not compiling for microMIPS code, @code{ZD} is equivalent to @code{p}."
"An address suitable for a @code{prefetch} instruction, or for any other
instruction with the same addressing mode as @code{prefetch}."
(if_then_else (match_test "TARGET_MICROMIPS")
(match_test "umips_12bit_offset_address_p (op, mode)")
(match_test "mips_address_insns (op, mode, false)")))
(if_then_else (match_test "ISA_HAS_PREFETCH_9BIT")
(match_test "mips_9bit_offset_address_p (op, mode)")
(match_test "mips_address_insns (op, mode, false)"))))
(define_memory_constraint "ZR"
"@internal

View File

@ -132,6 +132,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
#undef DRIVER_SELF_SPECS
#define DRIVER_SELF_SPECS \
MIPS_ISA_LEVEL_SPEC, \
BASE_DRIVER_SELF_SPECS, \
LINUX_DRIVER_SELF_SPECS

View File

@ -907,33 +907,3 @@
mips_expand_vec_reduc (operands[0], operands[1], gen_umin<mode>3);
DONE;
})
;; Integer division and modulus. For integer multiplication, see mips.md.
(define_insn "<u>div<mode>3"
[(set (match_operand:GPR 0 "register_operand" "=&d")
(any_div:GPR (match_operand:GPR 1 "register_operand" "d")
(match_operand:GPR 2 "register_operand" "d")))]
"TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A"
{
if (TARGET_LOONGSON_2EF)
return mips_output_division ("<d>div<u>.g\t%0,%1,%2", operands);
else
return mips_output_division ("gs<d>div<u>\t%0,%1,%2", operands);
}
[(set_attr "type" "idiv3")
(set_attr "mode" "<MODE>")])
(define_insn "<u>mod<mode>3"
[(set (match_operand:GPR 0 "register_operand" "=&d")
(any_mod:GPR (match_operand:GPR 1 "register_operand" "d")
(match_operand:GPR 2 "register_operand" "d")))]
"TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A"
{
if (TARGET_LOONGSON_2EF)
return mips_output_division ("<d>mod<u>.g\t%0,%1,%2", operands);
else
return mips_output_division ("gs<d>mod<u>\t%0,%1,%2", operands);
}
[(set_attr "type" "idiv3")
(set_attr "mode" "<MODE>")])

View File

@ -50,11 +50,13 @@ MIPS_CPU ("mips32r2", PROCESSOR_74KF2_1, 33, PTF_AVOID_BRANCHLIKELY)
as mips32r2. */
MIPS_CPU ("mips32r3", PROCESSOR_M4K, 34, PTF_AVOID_BRANCHLIKELY)
MIPS_CPU ("mips32r5", PROCESSOR_P5600, 36, PTF_AVOID_BRANCHLIKELY)
MIPS_CPU ("mips32r6", PROCESSOR_W32, 37, PTF_AVOID_BRANCHLIKELY)
MIPS_CPU ("mips64", PROCESSOR_5KC, 64, PTF_AVOID_BRANCHLIKELY)
/* ??? For now just tune the generic MIPS64r2 and above for 5KC as well. */
MIPS_CPU ("mips64r2", PROCESSOR_5KC, 65, PTF_AVOID_BRANCHLIKELY)
MIPS_CPU ("mips64r3", PROCESSOR_5KC, 66, PTF_AVOID_BRANCHLIKELY)
MIPS_CPU ("mips64r5", PROCESSOR_5KC, 68, PTF_AVOID_BRANCHLIKELY)
MIPS_CPU ("mips64r6", PROCESSOR_W64, 69, PTF_AVOID_BRANCHLIKELY)
/* MIPS I processors. */
MIPS_CPU ("r3000", PROCESSOR_R3000, 1, 0)

View File

@ -46,3 +46,6 @@ ADJUST_ALIGNMENT (CCV4, 16);
/* For MIPS DSP control registers. */
CC_MODE (CCDSP);
/* For floating point conditions in FP registers. */
CC_MODE (CCF);

View File

@ -347,6 +347,7 @@ extern bool umips_load_store_pair_p (bool, rtx *);
extern void umips_output_load_store_pair (bool, rtx *);
extern bool umips_movep_target_p (rtx, rtx);
extern bool umips_12bit_offset_address_p (rtx, machine_mode);
extern bool mips_9bit_offset_address_p (rtx, machine_mode);
extern bool lwsp_swsp_address_p (rtx, machine_mode);
extern bool m16_based_address_p (rtx, machine_mode,
int (*)(rtx_def*, machine_mode));

View File

@ -82,593 +82,605 @@ EnumValue
Enum(mips_mips_opt_value) String(32r5) Value(7)
EnumValue
Enum(mips_arch_opt_value) String(mips64) Value(8) Canonical
Enum(mips_arch_opt_value) String(mips32r6) Value(8) Canonical
EnumValue
Enum(mips_mips_opt_value) String(64) Value(8)
Enum(mips_mips_opt_value) String(32r6) Value(8)
EnumValue
Enum(mips_arch_opt_value) String(mips64r2) Value(9) Canonical
Enum(mips_arch_opt_value) String(mips64) Value(9) Canonical
EnumValue
Enum(mips_mips_opt_value) String(64r2) Value(9)
Enum(mips_mips_opt_value) String(64) Value(9)
EnumValue
Enum(mips_arch_opt_value) String(mips64r3) Value(10) Canonical
Enum(mips_arch_opt_value) String(mips64r2) Value(10) Canonical
EnumValue
Enum(mips_mips_opt_value) String(64r3) Value(10)
Enum(mips_mips_opt_value) String(64r2) Value(10)
EnumValue
Enum(mips_arch_opt_value) String(mips64r5) Value(11) Canonical
Enum(mips_arch_opt_value) String(mips64r3) Value(11) Canonical
EnumValue
Enum(mips_mips_opt_value) String(64r5) Value(11)
Enum(mips_mips_opt_value) String(64r3) Value(11)
EnumValue
Enum(mips_arch_opt_value) String(r3000) Value(12) Canonical
Enum(mips_arch_opt_value) String(mips64r5) Value(12) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r3k) Value(12)
Enum(mips_mips_opt_value) String(64r5) Value(12)
EnumValue
Enum(mips_arch_opt_value) String(3000) Value(12)
Enum(mips_arch_opt_value) String(mips64r6) Value(13) Canonical
EnumValue
Enum(mips_arch_opt_value) String(3k) Value(12)
Enum(mips_mips_opt_value) String(64r6) Value(13)
EnumValue
Enum(mips_arch_opt_value) String(r2000) Value(13) Canonical
Enum(mips_arch_opt_value) String(r3000) Value(14) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r2k) Value(13)
Enum(mips_arch_opt_value) String(r3k) Value(14)
EnumValue
Enum(mips_arch_opt_value) String(2000) Value(13)
Enum(mips_arch_opt_value) String(3000) Value(14)
EnumValue
Enum(mips_arch_opt_value) String(2k) Value(13)
Enum(mips_arch_opt_value) String(3k) Value(14)
EnumValue
Enum(mips_arch_opt_value) String(r3900) Value(14) Canonical
Enum(mips_arch_opt_value) String(r2000) Value(15) Canonical
EnumValue
Enum(mips_arch_opt_value) String(3900) Value(14)
Enum(mips_arch_opt_value) String(r2k) Value(15)
EnumValue
Enum(mips_arch_opt_value) String(r6000) Value(15) Canonical
Enum(mips_arch_opt_value) String(2000) Value(15)
EnumValue
Enum(mips_arch_opt_value) String(r6k) Value(15)
Enum(mips_arch_opt_value) String(2k) Value(15)
EnumValue
Enum(mips_arch_opt_value) String(6000) Value(15)
Enum(mips_arch_opt_value) String(r3900) Value(16) Canonical
EnumValue
Enum(mips_arch_opt_value) String(6k) Value(15)
Enum(mips_arch_opt_value) String(3900) Value(16)
EnumValue
Enum(mips_arch_opt_value) String(r4000) Value(16) Canonical
Enum(mips_arch_opt_value) String(r6000) Value(17) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4k) Value(16)
Enum(mips_arch_opt_value) String(r6k) Value(17)
EnumValue
Enum(mips_arch_opt_value) String(4000) Value(16)
Enum(mips_arch_opt_value) String(6000) Value(17)
EnumValue
Enum(mips_arch_opt_value) String(4k) Value(16)
Enum(mips_arch_opt_value) String(6k) Value(17)
EnumValue
Enum(mips_arch_opt_value) String(vr4100) Value(17) Canonical
Enum(mips_arch_opt_value) String(r4000) Value(18) Canonical
EnumValue
Enum(mips_arch_opt_value) String(4100) Value(17)
Enum(mips_arch_opt_value) String(r4k) Value(18)
EnumValue
Enum(mips_arch_opt_value) String(r4100) Value(17)
Enum(mips_arch_opt_value) String(4000) Value(18)
EnumValue
Enum(mips_arch_opt_value) String(vr4111) Value(18) Canonical
Enum(mips_arch_opt_value) String(4k) Value(18)
EnumValue
Enum(mips_arch_opt_value) String(4111) Value(18)
Enum(mips_arch_opt_value) String(vr4100) Value(19) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4111) Value(18)
Enum(mips_arch_opt_value) String(4100) Value(19)
EnumValue
Enum(mips_arch_opt_value) String(vr4120) Value(19) Canonical
Enum(mips_arch_opt_value) String(r4100) Value(19)
EnumValue
Enum(mips_arch_opt_value) String(4120) Value(19)
Enum(mips_arch_opt_value) String(vr4111) Value(20) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4120) Value(19)
Enum(mips_arch_opt_value) String(4111) Value(20)
EnumValue
Enum(mips_arch_opt_value) String(vr4130) Value(20) Canonical
Enum(mips_arch_opt_value) String(r4111) Value(20)
EnumValue
Enum(mips_arch_opt_value) String(4130) Value(20)
Enum(mips_arch_opt_value) String(vr4120) Value(21) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4130) Value(20)
Enum(mips_arch_opt_value) String(4120) Value(21)
EnumValue
Enum(mips_arch_opt_value) String(vr4300) Value(21) Canonical
Enum(mips_arch_opt_value) String(r4120) Value(21)
EnumValue
Enum(mips_arch_opt_value) String(4300) Value(21)
Enum(mips_arch_opt_value) String(vr4130) Value(22) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4300) Value(21)
Enum(mips_arch_opt_value) String(4130) Value(22)
EnumValue
Enum(mips_arch_opt_value) String(r4400) Value(22) Canonical
Enum(mips_arch_opt_value) String(r4130) Value(22)
EnumValue
Enum(mips_arch_opt_value) String(4400) Value(22)
Enum(mips_arch_opt_value) String(vr4300) Value(23) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4600) Value(23) Canonical
Enum(mips_arch_opt_value) String(4300) Value(23)
EnumValue
Enum(mips_arch_opt_value) String(4600) Value(23)
Enum(mips_arch_opt_value) String(r4300) Value(23)
EnumValue
Enum(mips_arch_opt_value) String(orion) Value(24) Canonical
Enum(mips_arch_opt_value) String(r4400) Value(24) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4650) Value(25) Canonical
Enum(mips_arch_opt_value) String(4400) Value(24)
EnumValue
Enum(mips_arch_opt_value) String(4650) Value(25)
Enum(mips_arch_opt_value) String(r4600) Value(25) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4700) Value(26) Canonical
Enum(mips_arch_opt_value) String(4600) Value(25)
EnumValue
Enum(mips_arch_opt_value) String(4700) Value(26)
Enum(mips_arch_opt_value) String(orion) Value(26) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r5900) Value(27) Canonical
Enum(mips_arch_opt_value) String(r4650) Value(27) Canonical
EnumValue
Enum(mips_arch_opt_value) String(5900) Value(27)
Enum(mips_arch_opt_value) String(4650) Value(27)
EnumValue
Enum(mips_arch_opt_value) String(loongson2e) Value(28) Canonical
Enum(mips_arch_opt_value) String(r4700) Value(28) Canonical
EnumValue
Enum(mips_arch_opt_value) String(loongson2f) Value(29) Canonical
Enum(mips_arch_opt_value) String(4700) Value(28)
EnumValue
Enum(mips_arch_opt_value) String(r8000) Value(30) Canonical
Enum(mips_arch_opt_value) String(r5900) Value(29) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r8k) Value(30)
Enum(mips_arch_opt_value) String(5900) Value(29)
EnumValue
Enum(mips_arch_opt_value) String(8000) Value(30)
Enum(mips_arch_opt_value) String(loongson2e) Value(30) Canonical
EnumValue
Enum(mips_arch_opt_value) String(8k) Value(30)
Enum(mips_arch_opt_value) String(loongson2f) Value(31) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r10000) Value(31) Canonical
Enum(mips_arch_opt_value) String(r8000) Value(32) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r10k) Value(31)
Enum(mips_arch_opt_value) String(r8k) Value(32)
EnumValue
Enum(mips_arch_opt_value) String(10000) Value(31)
Enum(mips_arch_opt_value) String(8000) Value(32)
EnumValue
Enum(mips_arch_opt_value) String(10k) Value(31)
Enum(mips_arch_opt_value) String(8k) Value(32)
EnumValue
Enum(mips_arch_opt_value) String(r12000) Value(32) Canonical
Enum(mips_arch_opt_value) String(r10000) Value(33) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r12k) Value(32)
Enum(mips_arch_opt_value) String(r10k) Value(33)
EnumValue
Enum(mips_arch_opt_value) String(12000) Value(32)
Enum(mips_arch_opt_value) String(10000) Value(33)
EnumValue
Enum(mips_arch_opt_value) String(12k) Value(32)
Enum(mips_arch_opt_value) String(10k) Value(33)
EnumValue
Enum(mips_arch_opt_value) String(r14000) Value(33) Canonical
Enum(mips_arch_opt_value) String(r12000) Value(34) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r14k) Value(33)
Enum(mips_arch_opt_value) String(r12k) Value(34)
EnumValue
Enum(mips_arch_opt_value) String(14000) Value(33)
Enum(mips_arch_opt_value) String(12000) Value(34)
EnumValue
Enum(mips_arch_opt_value) String(14k) Value(33)
Enum(mips_arch_opt_value) String(12k) Value(34)
EnumValue
Enum(mips_arch_opt_value) String(r16000) Value(34) Canonical
Enum(mips_arch_opt_value) String(r14000) Value(35) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r16k) Value(34)
Enum(mips_arch_opt_value) String(r14k) Value(35)
EnumValue
Enum(mips_arch_opt_value) String(16000) Value(34)
Enum(mips_arch_opt_value) String(14000) Value(35)
EnumValue
Enum(mips_arch_opt_value) String(16k) Value(34)
Enum(mips_arch_opt_value) String(14k) Value(35)
EnumValue
Enum(mips_arch_opt_value) String(vr5000) Value(35) Canonical
Enum(mips_arch_opt_value) String(r16000) Value(36) Canonical
EnumValue
Enum(mips_arch_opt_value) String(vr5k) Value(35)
Enum(mips_arch_opt_value) String(r16k) Value(36)
EnumValue
Enum(mips_arch_opt_value) String(5000) Value(35)
Enum(mips_arch_opt_value) String(16000) Value(36)
EnumValue
Enum(mips_arch_opt_value) String(5k) Value(35)
Enum(mips_arch_opt_value) String(16k) Value(36)
EnumValue
Enum(mips_arch_opt_value) String(r5000) Value(35)
Enum(mips_arch_opt_value) String(vr5000) Value(37) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r5k) Value(35)
Enum(mips_arch_opt_value) String(vr5k) Value(37)
EnumValue
Enum(mips_arch_opt_value) String(vr5400) Value(36) Canonical
Enum(mips_arch_opt_value) String(5000) Value(37)
EnumValue
Enum(mips_arch_opt_value) String(5400) Value(36)
Enum(mips_arch_opt_value) String(5k) Value(37)
EnumValue
Enum(mips_arch_opt_value) String(r5400) Value(36)
Enum(mips_arch_opt_value) String(r5000) Value(37)
EnumValue
Enum(mips_arch_opt_value) String(vr5500) Value(37) Canonical
Enum(mips_arch_opt_value) String(r5k) Value(37)
EnumValue
Enum(mips_arch_opt_value) String(5500) Value(37)
Enum(mips_arch_opt_value) String(vr5400) Value(38) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r5500) Value(37)
Enum(mips_arch_opt_value) String(5400) Value(38)
EnumValue
Enum(mips_arch_opt_value) String(rm7000) Value(38) Canonical
Enum(mips_arch_opt_value) String(r5400) Value(38)
EnumValue
Enum(mips_arch_opt_value) String(rm7k) Value(38)
Enum(mips_arch_opt_value) String(vr5500) Value(39) Canonical
EnumValue
Enum(mips_arch_opt_value) String(7000) Value(38)
Enum(mips_arch_opt_value) String(5500) Value(39)
EnumValue
Enum(mips_arch_opt_value) String(7k) Value(38)
Enum(mips_arch_opt_value) String(r5500) Value(39)
EnumValue
Enum(mips_arch_opt_value) String(r7000) Value(38)
Enum(mips_arch_opt_value) String(rm7000) Value(40) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r7k) Value(38)
Enum(mips_arch_opt_value) String(rm7k) Value(40)
EnumValue
Enum(mips_arch_opt_value) String(rm9000) Value(39) Canonical
Enum(mips_arch_opt_value) String(7000) Value(40)
EnumValue
Enum(mips_arch_opt_value) String(rm9k) Value(39)
Enum(mips_arch_opt_value) String(7k) Value(40)
EnumValue
Enum(mips_arch_opt_value) String(9000) Value(39)
Enum(mips_arch_opt_value) String(r7000) Value(40)
EnumValue
Enum(mips_arch_opt_value) String(9k) Value(39)
Enum(mips_arch_opt_value) String(r7k) Value(40)
EnumValue
Enum(mips_arch_opt_value) String(r9000) Value(39)
Enum(mips_arch_opt_value) String(rm9000) Value(41) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r9k) Value(39)
Enum(mips_arch_opt_value) String(rm9k) Value(41)
EnumValue
Enum(mips_arch_opt_value) String(4kc) Value(40) Canonical
Enum(mips_arch_opt_value) String(9000) Value(41)
EnumValue
Enum(mips_arch_opt_value) String(r4kc) Value(40)
Enum(mips_arch_opt_value) String(9k) Value(41)
EnumValue
Enum(mips_arch_opt_value) String(4km) Value(41) Canonical
Enum(mips_arch_opt_value) String(r9000) Value(41)
EnumValue
Enum(mips_arch_opt_value) String(r4km) Value(41)
Enum(mips_arch_opt_value) String(r9k) Value(41)
EnumValue
Enum(mips_arch_opt_value) String(4kp) Value(42) Canonical
Enum(mips_arch_opt_value) String(4kc) Value(42) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4kp) Value(42)
Enum(mips_arch_opt_value) String(r4kc) Value(42)
EnumValue
Enum(mips_arch_opt_value) String(4ksc) Value(43) Canonical
Enum(mips_arch_opt_value) String(4km) Value(43) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4ksc) Value(43)
Enum(mips_arch_opt_value) String(r4km) Value(43)
EnumValue
Enum(mips_arch_opt_value) String(m4k) Value(44) Canonical
Enum(mips_arch_opt_value) String(4kp) Value(44) Canonical
EnumValue
Enum(mips_arch_opt_value) String(m14kc) Value(45) Canonical
Enum(mips_arch_opt_value) String(r4kp) Value(44)
EnumValue
Enum(mips_arch_opt_value) String(m14k) Value(46) Canonical
Enum(mips_arch_opt_value) String(4ksc) Value(45) Canonical
EnumValue
Enum(mips_arch_opt_value) String(m14ke) Value(47) Canonical
Enum(mips_arch_opt_value) String(r4ksc) Value(45)
EnumValue
Enum(mips_arch_opt_value) String(m14kec) Value(48) Canonical
Enum(mips_arch_opt_value) String(m4k) Value(46) Canonical
EnumValue
Enum(mips_arch_opt_value) String(4kec) Value(49) Canonical
Enum(mips_arch_opt_value) String(m14kc) Value(47) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4kec) Value(49)
Enum(mips_arch_opt_value) String(m14k) Value(48) Canonical
EnumValue
Enum(mips_arch_opt_value) String(4kem) Value(50) Canonical
Enum(mips_arch_opt_value) String(m14ke) Value(49) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4kem) Value(50)
Enum(mips_arch_opt_value) String(m14kec) Value(50) Canonical
EnumValue
Enum(mips_arch_opt_value) String(4kep) Value(51) Canonical
Enum(mips_arch_opt_value) String(4kec) Value(51) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4kep) Value(51)
Enum(mips_arch_opt_value) String(r4kec) Value(51)
EnumValue
Enum(mips_arch_opt_value) String(4ksd) Value(52) Canonical
Enum(mips_arch_opt_value) String(4kem) Value(52) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r4ksd) Value(52)
Enum(mips_arch_opt_value) String(r4kem) Value(52)
EnumValue
Enum(mips_arch_opt_value) String(24kc) Value(53) Canonical
Enum(mips_arch_opt_value) String(4kep) Value(53) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kc) Value(53)
Enum(mips_arch_opt_value) String(r4kep) Value(53)
EnumValue
Enum(mips_arch_opt_value) String(24kf2_1) Value(54) Canonical
Enum(mips_arch_opt_value) String(4ksd) Value(54) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kf2_1) Value(54)
Enum(mips_arch_opt_value) String(r4ksd) Value(54)
EnumValue
Enum(mips_arch_opt_value) String(24kf) Value(55) Canonical
Enum(mips_arch_opt_value) String(24kc) Value(55) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kf) Value(55)
Enum(mips_arch_opt_value) String(r24kc) Value(55)
EnumValue
Enum(mips_arch_opt_value) String(24kf1_1) Value(56) Canonical
Enum(mips_arch_opt_value) String(24kf2_1) Value(56) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kf1_1) Value(56)
Enum(mips_arch_opt_value) String(r24kf2_1) Value(56)
EnumValue
Enum(mips_arch_opt_value) String(24kfx) Value(57) Canonical
Enum(mips_arch_opt_value) String(24kf) Value(57) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kfx) Value(57)
Enum(mips_arch_opt_value) String(r24kf) Value(57)
EnumValue
Enum(mips_arch_opt_value) String(24kx) Value(58) Canonical
Enum(mips_arch_opt_value) String(24kf1_1) Value(58) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kx) Value(58)
Enum(mips_arch_opt_value) String(r24kf1_1) Value(58)
EnumValue
Enum(mips_arch_opt_value) String(24kec) Value(59) Canonical
Enum(mips_arch_opt_value) String(24kfx) Value(59) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kec) Value(59)
Enum(mips_arch_opt_value) String(r24kfx) Value(59)
EnumValue
Enum(mips_arch_opt_value) String(24kef2_1) Value(60) Canonical
Enum(mips_arch_opt_value) String(24kx) Value(60) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kef2_1) Value(60)
Enum(mips_arch_opt_value) String(r24kx) Value(60)
EnumValue
Enum(mips_arch_opt_value) String(24kef) Value(61) Canonical
Enum(mips_arch_opt_value) String(24kec) Value(61) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kef) Value(61)
Enum(mips_arch_opt_value) String(r24kec) Value(61)
EnumValue
Enum(mips_arch_opt_value) String(24kef1_1) Value(62) Canonical
Enum(mips_arch_opt_value) String(24kef2_1) Value(62) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kef1_1) Value(62)
Enum(mips_arch_opt_value) String(r24kef2_1) Value(62)
EnumValue
Enum(mips_arch_opt_value) String(24kefx) Value(63) Canonical
Enum(mips_arch_opt_value) String(24kef) Value(63) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kefx) Value(63)
Enum(mips_arch_opt_value) String(r24kef) Value(63)
EnumValue
Enum(mips_arch_opt_value) String(24kex) Value(64) Canonical
Enum(mips_arch_opt_value) String(24kef1_1) Value(64) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r24kex) Value(64)
Enum(mips_arch_opt_value) String(r24kef1_1) Value(64)
EnumValue
Enum(mips_arch_opt_value) String(34kc) Value(65) Canonical
Enum(mips_arch_opt_value) String(24kefx) Value(65) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r34kc) Value(65)
Enum(mips_arch_opt_value) String(r24kefx) Value(65)
EnumValue
Enum(mips_arch_opt_value) String(34kf2_1) Value(66) Canonical
Enum(mips_arch_opt_value) String(24kex) Value(66) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r34kf2_1) Value(66)
Enum(mips_arch_opt_value) String(r24kex) Value(66)
EnumValue
Enum(mips_arch_opt_value) String(34kf) Value(67) Canonical
Enum(mips_arch_opt_value) String(34kc) Value(67) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r34kf) Value(67)
Enum(mips_arch_opt_value) String(r34kc) Value(67)
EnumValue
Enum(mips_arch_opt_value) String(34kf1_1) Value(68) Canonical
Enum(mips_arch_opt_value) String(34kf2_1) Value(68) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r34kf1_1) Value(68)
Enum(mips_arch_opt_value) String(r34kf2_1) Value(68)
EnumValue
Enum(mips_arch_opt_value) String(34kfx) Value(69) Canonical
Enum(mips_arch_opt_value) String(34kf) Value(69) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r34kfx) Value(69)
Enum(mips_arch_opt_value) String(r34kf) Value(69)
EnumValue
Enum(mips_arch_opt_value) String(34kx) Value(70) Canonical
Enum(mips_arch_opt_value) String(34kf1_1) Value(70) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r34kx) Value(70)
Enum(mips_arch_opt_value) String(r34kf1_1) Value(70)
EnumValue
Enum(mips_arch_opt_value) String(34kn) Value(71) Canonical
Enum(mips_arch_opt_value) String(34kfx) Value(71) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r34kn) Value(71)
Enum(mips_arch_opt_value) String(r34kfx) Value(71)
EnumValue
Enum(mips_arch_opt_value) String(74kc) Value(72) Canonical
Enum(mips_arch_opt_value) String(34kx) Value(72) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r74kc) Value(72)
Enum(mips_arch_opt_value) String(r34kx) Value(72)
EnumValue
Enum(mips_arch_opt_value) String(74kf2_1) Value(73) Canonical
Enum(mips_arch_opt_value) String(34kn) Value(73) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r74kf2_1) Value(73)
Enum(mips_arch_opt_value) String(r34kn) Value(73)
EnumValue
Enum(mips_arch_opt_value) String(74kf) Value(74) Canonical
Enum(mips_arch_opt_value) String(74kc) Value(74) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r74kf) Value(74)
Enum(mips_arch_opt_value) String(r74kc) Value(74)
EnumValue
Enum(mips_arch_opt_value) String(74kf1_1) Value(75) Canonical
Enum(mips_arch_opt_value) String(74kf2_1) Value(75) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r74kf1_1) Value(75)
Enum(mips_arch_opt_value) String(r74kf2_1) Value(75)
EnumValue
Enum(mips_arch_opt_value) String(74kfx) Value(76) Canonical
Enum(mips_arch_opt_value) String(74kf) Value(76) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r74kfx) Value(76)
Enum(mips_arch_opt_value) String(r74kf) Value(76)
EnumValue
Enum(mips_arch_opt_value) String(74kx) Value(77) Canonical
Enum(mips_arch_opt_value) String(74kf1_1) Value(77) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r74kx) Value(77)
Enum(mips_arch_opt_value) String(r74kf1_1) Value(77)
EnumValue
Enum(mips_arch_opt_value) String(74kf3_2) Value(78) Canonical
Enum(mips_arch_opt_value) String(74kfx) Value(78) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r74kf3_2) Value(78)
Enum(mips_arch_opt_value) String(r74kfx) Value(78)
EnumValue
Enum(mips_arch_opt_value) String(1004kc) Value(79) Canonical
Enum(mips_arch_opt_value) String(74kx) Value(79) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r1004kc) Value(79)
Enum(mips_arch_opt_value) String(r74kx) Value(79)
EnumValue
Enum(mips_arch_opt_value) String(1004kf2_1) Value(80) Canonical
Enum(mips_arch_opt_value) String(74kf3_2) Value(80) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r1004kf2_1) Value(80)
Enum(mips_arch_opt_value) String(r74kf3_2) Value(80)
EnumValue
Enum(mips_arch_opt_value) String(1004kf) Value(81) Canonical
Enum(mips_arch_opt_value) String(1004kc) Value(81) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r1004kf) Value(81)
Enum(mips_arch_opt_value) String(r1004kc) Value(81)
EnumValue
Enum(mips_arch_opt_value) String(1004kf1_1) Value(82) Canonical
Enum(mips_arch_opt_value) String(1004kf2_1) Value(82) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r1004kf1_1) Value(82)
Enum(mips_arch_opt_value) String(r1004kf2_1) Value(82)
EnumValue
Enum(mips_arch_opt_value) String(p5600) Value(83) Canonical
Enum(mips_arch_opt_value) String(1004kf) Value(83) Canonical
EnumValue
Enum(mips_arch_opt_value) String(5kc) Value(84) Canonical
Enum(mips_arch_opt_value) String(r1004kf) Value(83)
EnumValue
Enum(mips_arch_opt_value) String(r5kc) Value(84)
Enum(mips_arch_opt_value) String(1004kf1_1) Value(84) Canonical
EnumValue
Enum(mips_arch_opt_value) String(5kf) Value(85) Canonical
Enum(mips_arch_opt_value) String(r1004kf1_1) Value(84)
EnumValue
Enum(mips_arch_opt_value) String(r5kf) Value(85)
Enum(mips_arch_opt_value) String(p5600) Value(85) Canonical
EnumValue
Enum(mips_arch_opt_value) String(20kc) Value(86) Canonical
Enum(mips_arch_opt_value) String(5kc) Value(86) Canonical
EnumValue
Enum(mips_arch_opt_value) String(r20kc) Value(86)
Enum(mips_arch_opt_value) String(r5kc) Value(86)
EnumValue
Enum(mips_arch_opt_value) String(sb1) Value(87) Canonical
Enum(mips_arch_opt_value) String(5kf) Value(87) Canonical
EnumValue
Enum(mips_arch_opt_value) String(sb1a) Value(88) Canonical
Enum(mips_arch_opt_value) String(r5kf) Value(87)
EnumValue
Enum(mips_arch_opt_value) String(sr71000) Value(89) Canonical
Enum(mips_arch_opt_value) String(20kc) Value(88) Canonical
EnumValue
Enum(mips_arch_opt_value) String(sr71k) Value(89)
Enum(mips_arch_opt_value) String(r20kc) Value(88)
EnumValue
Enum(mips_arch_opt_value) String(xlr) Value(90) Canonical
Enum(mips_arch_opt_value) String(sb1) Value(89) Canonical
EnumValue
Enum(mips_arch_opt_value) String(loongson3a) Value(91) Canonical
Enum(mips_arch_opt_value) String(sb1a) Value(90) Canonical
EnumValue
Enum(mips_arch_opt_value) String(octeon) Value(92) Canonical
Enum(mips_arch_opt_value) String(sr71000) Value(91) Canonical
EnumValue
Enum(mips_arch_opt_value) String(octeon+) Value(93) Canonical
Enum(mips_arch_opt_value) String(sr71k) Value(91)
EnumValue
Enum(mips_arch_opt_value) String(octeon2) Value(94) Canonical
Enum(mips_arch_opt_value) String(xlr) Value(92) Canonical
EnumValue
Enum(mips_arch_opt_value) String(octeon3) Value(95) Canonical
Enum(mips_arch_opt_value) String(loongson3a) Value(93) Canonical
EnumValue
Enum(mips_arch_opt_value) String(xlp) Value(96) Canonical
Enum(mips_arch_opt_value) String(octeon) Value(94) Canonical
EnumValue
Enum(mips_arch_opt_value) String(octeon+) Value(95) Canonical
EnumValue
Enum(mips_arch_opt_value) String(octeon2) Value(96) Canonical
EnumValue
Enum(mips_arch_opt_value) String(octeon3) Value(97) Canonical
EnumValue
Enum(mips_arch_opt_value) String(xlp) Value(98) Canonical

View File

@ -182,9 +182,10 @@ along with GCC; see the file COPYING3. If not see
#define MIPS_LUI(DEST, VALUE) \
((0xf << 26) | ((DEST) << 16) | (VALUE))
/* Return the opcode to jump to register DEST. */
/* Return the opcode to jump to register DEST. When the JR opcode is not
available use JALR $0, DEST. */
#define MIPS_JR(DEST) \
(((DEST) << 21) | 0x8)
(((DEST) << 21) | (ISA_HAS_JR ? 0x8 : 0x9))
/* Return the opcode for:
@ -1225,6 +1226,32 @@ static const struct mips_rtx_cost_data
COSTS_N_INSNS (8), /* int_div_di */
2, /* branch_cost */
4 /* memory_latency */
},
{ /* W32 */
COSTS_N_INSNS (4), /* fp_add */
COSTS_N_INSNS (4), /* fp_mult_sf */
COSTS_N_INSNS (5), /* fp_mult_df */
COSTS_N_INSNS (17), /* fp_div_sf */
COSTS_N_INSNS (32), /* fp_div_df */
COSTS_N_INSNS (5), /* int_mult_si */
COSTS_N_INSNS (5), /* int_mult_di */
COSTS_N_INSNS (41), /* int_div_si */
COSTS_N_INSNS (41), /* int_div_di */
1, /* branch_cost */
4 /* memory_latency */
},
{ /* W64 */
COSTS_N_INSNS (4), /* fp_add */
COSTS_N_INSNS (4), /* fp_mult_sf */
COSTS_N_INSNS (5), /* fp_mult_df */
COSTS_N_INSNS (17), /* fp_div_sf */
COSTS_N_INSNS (32), /* fp_div_df */
COSTS_N_INSNS (5), /* int_mult_si */
COSTS_N_INSNS (5), /* int_mult_di */
COSTS_N_INSNS (41), /* int_div_si */
COSTS_N_INSNS (41), /* int_div_di */
1, /* branch_cost */
4 /* memory_latency */
}
};
@ -2593,6 +2620,20 @@ umips_12bit_offset_address_p (rtx x, machine_mode mode)
&& UMIPS_12BIT_OFFSET_P (INTVAL (addr.offset)));
}
/* Return true if X is a legitimate address with a 9-bit offset.
MODE is the mode of the value being accessed. */
bool
mips_9bit_offset_address_p (rtx x, machine_mode mode)
{
struct mips_address_info addr;
return (mips_classify_address (&addr, x, mode, false)
&& addr.type == ADDRESS_REG
&& CONST_INT_P (addr.offset)
&& MIPS_9BIT_OFFSET_P (INTVAL (addr.offset)));
}
/* Return the number of instructions needed to load constant X,
assuming that BASE_INSN_LENGTH is the length of one instruction.
Return 0 if X isn't a valid constant. */
@ -4102,6 +4143,11 @@ mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
*total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
return false;
case FMA:
if (ISA_HAS_FP_MADDF_MSUBF)
*total = mips_fp_mult_cost (mode);
return false;
case MULT:
if (float_mode_p)
*total = mips_fp_mult_cost (mode);
@ -4112,7 +4158,7 @@ mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
? mips_cost->int_mult_si * 3 + 6
: COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
else if (!speed)
*total = COSTS_N_INSNS (ISA_HAS_MUL3 ? 1 : 2) + 1;
*total = COSTS_N_INSNS ((ISA_HAS_MUL3 || ISA_HAS_R6MUL) ? 1 : 2) + 1;
else if (mode == DImode)
*total = mips_cost->int_mult_di;
else
@ -4188,6 +4234,52 @@ mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
}
*total = mips_zero_extend_cost (mode, XEXP (x, 0));
return false;
case TRUNCATE:
/* Costings for highpart multiplies. Matching patterns of the form:
(lshiftrt:DI (mult:DI (sign_extend:DI (...)
(sign_extend:DI (...))
(const_int 32)
*/
if (ISA_HAS_R6MUL
&& (GET_CODE (XEXP (x, 0)) == ASHIFTRT
|| GET_CODE (XEXP (x, 0)) == LSHIFTRT)
&& CONST_INT_P (XEXP (XEXP (x, 0), 1))
&& ((INTVAL (XEXP (XEXP (x, 0), 1)) == 32
&& GET_MODE (XEXP (x, 0)) == DImode)
|| (ISA_HAS_R6DMUL
&& INTVAL (XEXP (XEXP (x, 0), 1)) == 64
&& GET_MODE (XEXP (x, 0)) == TImode))
&& GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
&& ((GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == SIGN_EXTEND
&& GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == SIGN_EXTEND)
|| (GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ZERO_EXTEND
&& (GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1))
== ZERO_EXTEND))))
{
if (!speed)
*total = COSTS_N_INSNS (1) + 1;
else if (mode == DImode)
*total = mips_cost->int_mult_di;
else
*total = mips_cost->int_mult_si;
/* Sign extension is free, zero extension costs for DImode when
on a 64bit core / when DMUL is present. */
for (int i = 0; i < 2; ++i)
{
rtx op = XEXP (XEXP (XEXP (x, 0), 0), i);
if (ISA_HAS_R6DMUL
&& GET_CODE (op) == ZERO_EXTEND
&& GET_MODE (op) == DImode)
*total += rtx_cost (op, MULT, i, speed);
else
*total += rtx_cost (XEXP (op, 0), GET_CODE (op), 0, speed);
}
return true;
}
return false;
case FLOAT:
case UNSIGNED_FLOAT:
@ -4971,17 +5063,32 @@ mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
{
enum rtx_code cmp_code;
/* Floating-point tests use a separate C.cond.fmt comparison to
set a condition code register. The branch or conditional move
will then compare that register against zero.
/* Floating-point tests use a separate C.cond.fmt or CMP.cond.fmt
comparison to set a register. The branch or conditional move will
then compare that register against zero.
Set CMP_CODE to the code of the comparison instruction and
*CODE to the code that the branch or move should use. */
cmp_code = *code;
*code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
*op0 = (ISA_HAS_8CC
? mips_allocate_fcc (CCmode)
: gen_rtx_REG (CCmode, FPSW_REGNUM));
if (ISA_HAS_CCF)
{
/* All FP conditions can be implemented directly with CMP.cond.fmt
or by reversing the operands. */
*code = NE;
*op0 = gen_reg_rtx (CCFmode);
}
else
{
/* Three FP conditions cannot be implemented by reversing the
operands for C.cond.fmt, instead a reversed condition code is
required and a test for false. */
*code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
if (ISA_HAS_8CC)
*op0 = mips_allocate_fcc (CCmode);
else
*op0 = gen_rtx_REG (CCmode, FPSW_REGNUM);
}
*op1 = const0_rtx;
mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
}
@ -5071,9 +5178,45 @@ mips_expand_conditional_move (rtx *operands)
mips_emit_compare (&code, &op0, &op1, true);
cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
emit_insn (gen_rtx_SET (VOIDmode, operands[0],
gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
operands[2], operands[3])));
/* There is no direct support for general conditional GP move involving
two registers using SEL. */
if (ISA_HAS_SEL
&& INTEGRAL_MODE_P (GET_MODE (operands[2]))
&& register_operand (operands[2], VOIDmode)
&& register_operand (operands[3], VOIDmode))
{
machine_mode mode = GET_MODE (operands[0]);
rtx temp = gen_reg_rtx (mode);
rtx temp2 = gen_reg_rtx (mode);
emit_insn (gen_rtx_SET (VOIDmode, temp,
gen_rtx_IF_THEN_ELSE (mode, cond,
operands[2], const0_rtx)));
/* Flip the test for the second operand. */
cond = gen_rtx_fmt_ee ((code == EQ) ? NE : EQ, GET_MODE (op0), op0, op1);
emit_insn (gen_rtx_SET (VOIDmode, temp2,
gen_rtx_IF_THEN_ELSE (mode, cond,
operands[3], const0_rtx)));
/* Merge the two results, at least one is guaranteed to be zero. */
emit_insn (gen_rtx_SET (VOIDmode, operands[0],
gen_rtx_IOR (mode, temp, temp2)));
}
else
{
if (FLOAT_MODE_P (GET_MODE (operands[2])) && !ISA_HAS_SEL)
{
operands[2] = force_reg (GET_MODE (operands[0]), operands[2]);
operands[3] = force_reg (GET_MODE (operands[0]), operands[3]);
}
emit_insn (gen_rtx_SET (VOIDmode, operands[0],
gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
operands[2], operands[3])));
}
}
/* Perform the comparison in COMPARISON, then trap if the condition holds. */
@ -5107,7 +5250,9 @@ mips_expand_conditional_trap (rtx comparison)
mode = GET_MODE (XEXP (comparison, 0));
op0 = force_reg (mode, op0);
if (!arith_operand (op1, mode))
if (!(ISA_HAS_COND_TRAPI
? arith_operand (op1, mode)
: reg_or_0_operand (op1, mode)))
op1 = force_reg (mode, op1);
emit_insn (gen_rtx_TRAP_IF (VOIDmode,
@ -7469,6 +7614,10 @@ mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
bool
mips_expand_block_move (rtx dest, rtx src, rtx length)
{
/* Disable entirely for R6 initially. */
if (!ISA_HAS_LWL_LWR)
return false;
if (CONST_INT_P (length))
{
if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
@ -8231,11 +8380,17 @@ mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
switch (code)
{
case EQ:
fputs ("c1f", file);
if (ISA_HAS_CCF)
fputs ("c1eqz", file);
else
fputs ("c1f", file);
break;
case NE:
fputs ("c1t", file);
if (ISA_HAS_CCF)
fputs ("c1nez", file);
else
fputs ("c1t", file);
break;
default:
@ -8365,7 +8520,7 @@ mips_print_operand (FILE *file, rtx op, int letter)
break;
case 'Z':
if (ISA_HAS_8CC)
if (ISA_HAS_8CC || ISA_HAS_CCF)
{
mips_print_operand (file, op, 0);
fputc (',', file);
@ -9917,7 +10072,8 @@ mips_must_initialize_gp_p (void)
static bool
mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
{
if (MD_REG_P (regno))
if ((ISA_HAS_HILO || TARGET_DSP)
&& MD_REG_P (regno))
return true;
if (TARGET_DSP && DSP_ACC_REG_P (regno))
@ -11891,7 +12047,7 @@ mips_hard_regno_mode_ok_p (unsigned int regno, machine_mode mode)
size = GET_MODE_SIZE (mode);
mclass = GET_MODE_CLASS (mode);
if (GP_REG_P (regno))
if (GP_REG_P (regno) && mode != CCFmode)
return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
if (FP_REG_P (regno)
@ -11903,6 +12059,13 @@ mips_hard_regno_mode_ok_p (unsigned int regno, machine_mode mode)
if (TARGET_O32_FP64A_ABI && size <= 4 && (regno & 1) != 0)
return false;
/* The FPXX ABI requires double-precision values to be placed in
even-numbered registers. Disallow odd-numbered registers with
CCFmode because CCFmode double-precision compares will write a
64-bit value to a register. */
if (mode == CCFmode)
return !(TARGET_FLOATXX && (regno & 1) != 0);
/* Allow 64-bit vector modes for Loongson-2E/2F. */
if (TARGET_LOONGSON_VECTORS
&& (mode == V2SImode
@ -12062,6 +12225,7 @@ mips_mode_ok_for_mov_fmt_p (machine_mode mode)
{
switch (mode)
{
case CCFmode:
case SFmode:
return TARGET_HARD_FLOAT;
@ -15934,8 +16098,10 @@ mips_mult_zero_zero_cost (struct mips_sim *state, bool setting)
static void
mips_set_fast_mult_zero_zero_p (struct mips_sim *state)
{
if (TARGET_MIPS16)
/* No MTLO or MTHI available. */
if (TARGET_MIPS16 || !ISA_HAS_HILO)
/* No MTLO or MTHI available for MIPS16. Also, when there are no HI or LO
registers then there is no reason to zero them, arbitrarily choose to
say that "MULT $0,$0" would be faster. */
mips_tuning_info.fast_mult_zero_zero_p = true;
else
{
@ -17179,7 +17345,10 @@ mips_option_override (void)
if ((target_flags_explicit & MASK_FLOAT64) != 0)
{
if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
if (mips_isa_rev >= 6 && !TARGET_FLOAT64)
error ("the %qs architecture does not support %<-mfp32%>",
mips_arch_info->name);
else if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
error ("unsupported combination: %s", "-mfp64 -msingle-float");
else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
@ -17195,9 +17364,13 @@ mips_option_override (void)
}
else
{
/* -msingle-float selects 32-bit float registers. Otherwise the
float registers should be the same size as the integer ones. */
if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
/* -msingle-float selects 32-bit float registers. On r6 and later,
-mdouble-float selects 64-bit float registers, since the old paired
register model is not supported. In other cases the float registers
should be the same size as the integer ones. */
if (mips_isa_rev >= 6 && TARGET_DOUBLE_FLOAT && !TARGET_FLOATXX)
target_flags |= MASK_FLOAT64;
else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
target_flags |= MASK_FLOAT64;
else
target_flags &= ~MASK_FLOAT64;
@ -17205,6 +17378,8 @@ mips_option_override (void)
if (mips_abi != ABI_32 && TARGET_FLOATXX)
error ("%<-mfpxx%> can only be used with the o32 ABI");
else if (TARGET_FLOAT64 && TARGET_FLOATXX)
error ("unsupported combination: %s", "-mfp64 -mfpxx");
else if (ISA_MIPS1 && !TARGET_FLOAT32)
error ("%<-march=%s%> requires %<-mfp32%>", mips_arch_info->name);
else if (TARGET_FLOATXX && !mips_lra_flag)
@ -17382,6 +17557,27 @@ mips_option_override (void)
}
}
/* Set NaN and ABS defaults. */
if (mips_nan == MIPS_IEEE_754_DEFAULT && !ISA_HAS_IEEE_754_LEGACY)
mips_nan = MIPS_IEEE_754_2008;
if (mips_abs == MIPS_IEEE_754_DEFAULT && !ISA_HAS_IEEE_754_LEGACY)
mips_abs = MIPS_IEEE_754_2008;
/* Check for IEEE 754 legacy/2008 support. */
if ((mips_nan == MIPS_IEEE_754_LEGACY
|| mips_abs == MIPS_IEEE_754_LEGACY)
&& !ISA_HAS_IEEE_754_LEGACY)
warning (0, "the %qs architecture does not support %<-m%s=legacy%>",
mips_arch_info->name,
mips_nan == MIPS_IEEE_754_LEGACY ? "nan" : "abs");
if ((mips_nan == MIPS_IEEE_754_2008
|| mips_abs == MIPS_IEEE_754_2008)
&& !ISA_HAS_IEEE_754_2008)
warning (0, "the %qs architecture does not support %<-m%s=2008%>",
mips_arch_info->name,
mips_nan == MIPS_IEEE_754_2008 ? "nan" : "abs");
/* Pre-IEEE 754-2008 MIPS hardware has a quirky almost-IEEE format
for all its floating point. */
if (mips_nan != MIPS_IEEE_754_2008)
@ -17436,6 +17632,14 @@ mips_option_override (void)
if (TARGET_DSPR2)
TARGET_DSP = true;
if (TARGET_DSP && mips_isa_rev >= 6)
{
error ("the %qs architecture does not support DSP instructions",
mips_arch_info->name);
TARGET_DSP = false;
TARGET_DSPR2 = false;
}
/* .eh_frame addresses should be the same width as a C pointer.
Most MIPS ABIs support only one pointer size, so the assembler
will usually know exactly how big an .eh_frame address is.
@ -17616,6 +17820,10 @@ mips_conditional_register_usage (void)
AND_COMPL_HARD_REG_SET (accessible_reg_set,
reg_class_contents[(int) DSP_ACC_REGS]);
if (!ISA_HAS_HILO)
AND_COMPL_HARD_REG_SET (accessible_reg_set,
reg_class_contents[(int) MD_REGS]);
if (!TARGET_HARD_FLOAT)
{
AND_COMPL_HARD_REG_SET (accessible_reg_set,
@ -17630,7 +17838,8 @@ mips_conditional_register_usage (void)
RTL that refers directly to ST_REG_FIRST. */
AND_COMPL_HARD_REG_SET (accessible_reg_set,
reg_class_contents[(int) ST_REGS]);
SET_HARD_REG_BIT (accessible_reg_set, FPSW_REGNUM);
if (!ISA_HAS_CCF)
SET_HARD_REG_BIT (accessible_reg_set, FPSW_REGNUM);
fixed_regs[FPSW_REGNUM] = call_used_regs[FPSW_REGNUM] = 1;
}
if (TARGET_MIPS16)
@ -17805,6 +18014,8 @@ mips_mulsidi3_gen_fn (enum rtx_code ext_code)
the extension is not needed for signed multiplication. In order to
ensure that we always remove the redundant sign-extension in this
case we still expand mulsidi3 for DMUL. */
if (ISA_HAS_R6DMUL)
return signed_p ? gen_mulsidi3_64bit_r6dmul : NULL;
if (ISA_HAS_DMUL3)
return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
if (TARGET_MIPS16)
@ -17817,6 +18028,8 @@ mips_mulsidi3_gen_fn (enum rtx_code ext_code)
}
else
{
if (ISA_HAS_R6MUL)
return (signed_p ? gen_mulsidi3_32bit_r6 : gen_umulsidi3_32bit_r6);
if (TARGET_MIPS16)
return (signed_p
? gen_mulsidi3_32bit_mips16

View File

@ -210,10 +210,12 @@ struct mips_cpu_info {
#define ISA_MIPS32R2 (mips_isa == 33)
#define ISA_MIPS32R3 (mips_isa == 34)
#define ISA_MIPS32R5 (mips_isa == 36)
#define ISA_MIPS32R6 (mips_isa == 37)
#define ISA_MIPS64 (mips_isa == 64)
#define ISA_MIPS64R2 (mips_isa == 65)
#define ISA_MIPS64R3 (mips_isa == 66)
#define ISA_MIPS64R5 (mips_isa == 68)
#define ISA_MIPS64R6 (mips_isa == 69)
/* Architecture target defines. */
#define TARGET_LOONGSON_2E (mips_arch == PROCESSOR_LOONGSON_2E)
@ -458,42 +460,12 @@ struct mips_cpu_info {
builtin_define ("__mips=4"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS4"); \
} \
else if (ISA_MIPS32) \
else if (mips_isa >= 32 && mips_isa < 64) \
{ \
builtin_define ("__mips=32"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS32"); \
} \
else if (ISA_MIPS32R2) \
{ \
builtin_define ("__mips=32"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS32"); \
} \
else if (ISA_MIPS32R3) \
{ \
builtin_define ("__mips=32"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS32"); \
} \
else if (ISA_MIPS32R5) \
{ \
builtin_define ("__mips=32"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS32"); \
} \
else if (ISA_MIPS64) \
{ \
builtin_define ("__mips=64"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS64"); \
} \
else if (ISA_MIPS64R2) \
{ \
builtin_define ("__mips=64"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS64"); \
} \
else if (ISA_MIPS64R3) \
{ \
builtin_define ("__mips=64"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS64"); \
} \
else if (ISA_MIPS64R5) \
else if (mips_isa >= 64) \
{ \
builtin_define ("__mips=64"); \
builtin_define ("_MIPS_ISA=_MIPS_ISA_MIPS64"); \
@ -673,10 +645,14 @@ struct mips_cpu_info {
#define MULTILIB_ISA_DEFAULT "mips32"
#elif MIPS_ISA_DEFAULT == 33
#define MULTILIB_ISA_DEFAULT "mips32r2"
#elif MIPS_ISA_DEFAULT == 37
#define MULTILIB_ISA_DEFAULT "mips32r6"
#elif MIPS_ISA_DEFAULT == 64
#define MULTILIB_ISA_DEFAULT "mips64"
#elif MIPS_ISA_DEFAULT == 65
#define MULTILIB_ISA_DEFAULT "mips64r2"
#elif MIPS_ISA_DEFAULT == 69
#define MULTILIB_ISA_DEFAULT "mips64r6"
#else
#define MULTILIB_ISA_DEFAULT "mips1"
#endif
@ -743,11 +719,13 @@ struct mips_cpu_info {
|march=34k*|march=74k*|march=m14k*|march=1004k*: -mips32r2} \
%{march=mips32r3: -mips32r3} \
%{march=mips32r5|march=p5600: -mips32r5} \
%{march=mips32r6: -mips32r6} \
%{march=mips64|march=5k*|march=20k*|march=sb1*|march=sr71000 \
|march=xlr: -mips64} \
%{march=mips64r2|march=loongson3a|march=octeon|march=xlp: -mips64r2} \
%{march=mips64r3: -mips64r3} \
%{march=mips64r5: -mips64r5} \
%{march=mips64r6: -mips64r6} \
%{!march=*: -" MULTILIB_ISA_DEFAULT "}}"
/* A spec that infers a -mhard-float or -msoft-float setting from an
@ -776,8 +754,11 @@ struct mips_cpu_info {
/* Infer a -msynci setting from a -mips argument, on the assumption that
-msynci is desired where possible. */
#define MIPS_ISA_SYNCI_SPEC \
"%{msynci|mno-synci:;:%{mips32r2|mips32r3|mips32r5|mips64r2|mips64r3 \
|mips64r5:-msynci;:-mno-synci}}"
"%{msynci|mno-synci:;:%{mips32r2|mips32r3|mips32r5|mips32r6|mips64r2 \
|mips64r3|mips64r5|mips64r6:-msynci;:-mno-synci}}"
#define MIPS_ISA_NAN2008_SPEC \
"%{mnan*:;mips32r6|mips64r6:-mnan=2008}"
#if (MIPS_ABI_DEFAULT == ABI_O64 \
|| MIPS_ABI_DEFAULT == ABI_N32 \
@ -827,11 +808,14 @@ struct mips_cpu_info {
/* A spec that infers the -mdsp setting from an -march argument. */
#define BASE_DRIVER_SELF_SPECS \
MIPS_ISA_NAN2008_SPEC, \
"%{!mno-dsp: \
%{march=24ke*|march=34kc*|march=34kf*|march=34kx*|march=1004k*: -mdsp} \
%{march=74k*|march=m14ke*: %{!mno-dspr2: -mdspr2 -mdsp}}}"
#define DRIVER_SELF_SPECS BASE_DRIVER_SELF_SPECS
#define DRIVER_SELF_SPECS \
MIPS_ISA_LEVEL_SPEC, \
BASE_DRIVER_SELF_SPECS
#define GENERATE_DIVIDE_TRAPS (TARGET_DIVIDE_TRAPS \
&& ISA_HAS_COND_TRAP)
@ -864,12 +848,15 @@ struct mips_cpu_info {
|| ISA_MIPS64 \
|| ISA_MIPS64R2 \
|| ISA_MIPS64R3 \
|| ISA_MIPS64R5)
|| ISA_MIPS64R5 \
|| ISA_MIPS64R6)
#define ISA_HAS_JR (mips_isa_rev <= 5)
/* ISA has branch likely instructions (e.g. mips2). */
/* Disable branchlikely for tx39 until compare rewrite. They haven't
been generated up to this point. */
#define ISA_HAS_BRANCHLIKELY (!ISA_MIPS1)
#define ISA_HAS_BRANCHLIKELY (!ISA_MIPS1 && mips_isa_rev <= 5)
/* ISA has 32 single-precision registers. */
#define ISA_HAS_ODD_SPREG ((mips_isa_rev >= 1 \
@ -885,7 +872,8 @@ struct mips_cpu_info {
|| TARGET_MIPS7000 \
|| TARGET_MIPS9000 \
|| TARGET_MAD \
|| mips_isa_rev >= 1) \
|| (mips_isa_rev >= 1 \
&& mips_isa_rev <= 5)) \
&& !TARGET_MIPS16)
/* ISA has a three-operand multiplication instruction. */
@ -893,30 +881,48 @@ struct mips_cpu_info {
&& TARGET_OCTEON \
&& !TARGET_MIPS16)
/* ISA supports instructions DMULT and DMULTU. */
#define ISA_HAS_DMULT (TARGET_64BIT && !TARGET_MIPS5900)
/* ISA has HI and LO registers. */
#define ISA_HAS_HILO (mips_isa_rev <= 5)
/* ISA supports instructions MULT and MULTU.
This is always true, but the macro is needed for ISA_HAS_<D>MULT
in mips.md. */
#define ISA_HAS_MULT (1)
/* ISA supports instructions DMULT and DMULTU. */
#define ISA_HAS_DMULT (TARGET_64BIT \
&& !TARGET_MIPS5900 \
&& mips_isa_rev <= 5)
/* ISA supports instructions MULT and MULTU. */
#define ISA_HAS_MULT (mips_isa_rev <= 5)
/* ISA supports instructions MUL, MULU, MUH, MUHU. */
#define ISA_HAS_R6MUL (mips_isa_rev >= 6)
/* ISA supports instructions DMUL, DMULU, DMUH, DMUHU. */
#define ISA_HAS_R6DMUL (TARGET_64BIT && mips_isa_rev >= 6)
/* ISA supports instructions DDIV and DDIVU. */
#define ISA_HAS_DDIV (TARGET_64BIT && !TARGET_MIPS5900)
#define ISA_HAS_DDIV (TARGET_64BIT \
&& !TARGET_MIPS5900 \
&& mips_isa_rev <= 5)
/* ISA supports instructions DIV and DIVU.
This is always true, but the macro is needed for ISA_HAS_<D>DIV
in mips.md. */
#define ISA_HAS_DIV (1)
#define ISA_HAS_DIV (mips_isa_rev <= 5)
#define ISA_HAS_DIV3 ((TARGET_LOONGSON_2EF \
|| TARGET_LOONGSON_3A) \
&& !TARGET_MIPS16)
/* ISA supports instructions DIV, DIVU, MOD and MODU. */
#define ISA_HAS_R6DIV (mips_isa_rev >= 6)
/* ISA supports instructions DDIV, DDIVU, DMOD and DMODU. */
#define ISA_HAS_R6DDIV (TARGET_64BIT && mips_isa_rev >= 6)
/* ISA has the floating-point conditional move instructions introduced
in mips4. */
#define ISA_HAS_FP_CONDMOVE ((ISA_MIPS4 \
|| mips_isa_rev >= 1) \
|| (mips_isa_rev >= 1 \
&& mips_isa_rev <= 5)) \
&& !TARGET_MIPS5500 \
&& !TARGET_MIPS16)
@ -933,7 +939,15 @@ struct mips_cpu_info {
/* ISA has the mips4 FP condition code instructions: FP-compare to CC,
branch on CC, and move (both FP and non-FP) on CC. */
#define ISA_HAS_8CC (ISA_MIPS4 || mips_isa_rev >= 1)
#define ISA_HAS_8CC (ISA_MIPS4 \
|| (mips_isa_rev >= 1 \
&& mips_isa_rev <= 5))
/* ISA has the FP condition code instructions that store the flag in an
FP register. */
#define ISA_HAS_CCF (mips_isa_rev >= 6)
#define ISA_HAS_SEL (mips_isa_rev >= 6)
/* This is a catch all for other mips4 instructions: indexed load, the
FP madd and msub instructions, and the FP recip and recip sqrt
@ -941,7 +955,8 @@ struct mips_cpu_info {
ISA_HAS_* macros. */
#define ISA_HAS_FP4 ((ISA_MIPS4 \
|| ISA_MIPS64 \
|| mips_isa_rev >= 2) \
|| (mips_isa_rev >= 2 \
&& mips_isa_rev <= 5)) \
&& !TARGET_MIPS16)
/* ISA has floating-point indexed load and store instructions
@ -949,14 +964,22 @@ struct mips_cpu_info {
#define ISA_HAS_LXC1_SXC1 ISA_HAS_FP4
/* ISA has paired-single instructions. */
#define ISA_HAS_PAIRED_SINGLE (ISA_MIPS64 || mips_isa_rev >= 2)
#define ISA_HAS_PAIRED_SINGLE (ISA_MIPS64 \
|| (mips_isa_rev >= 2 \
&& mips_isa_rev <= 5))
/* ISA has conditional trap instructions. */
#define ISA_HAS_COND_TRAP (!ISA_MIPS1 \
&& !TARGET_MIPS16)
/* ISA has conditional trap with immediate instructions. */
#define ISA_HAS_COND_TRAPI (!ISA_MIPS1 \
&& mips_isa_rev <= 5 \
&& !TARGET_MIPS16)
/* ISA has integer multiply-accumulate instructions, madd and msub. */
#define ISA_HAS_MADD_MSUB (mips_isa_rev >= 1)
#define ISA_HAS_MADD_MSUB (mips_isa_rev >= 1 \
&& mips_isa_rev <= 5)
/* Integer multiply-accumulate instructions should be generated. */
#define GENERATE_MADD_MSUB (TARGET_IMADD && !TARGET_MIPS16)
@ -964,6 +987,9 @@ struct mips_cpu_info {
/* ISA has floating-point madd and msub instructions 'd = a * b [+-] c'. */
#define ISA_HAS_FP_MADD4_MSUB4 ISA_HAS_FP4
/* ISA has floating-point MADDF and MSUBF instructions 'd = d [+-] a * b'. */
#define ISA_HAS_FP_MADDF_MSUBF (mips_isa_rev >= 6)
/* ISA has floating-point madd and msub instructions 'c = a * b [+-] c'. */
#define ISA_HAS_FP_MADD3_MSUB3 TARGET_LOONGSON_2EF
@ -985,10 +1011,19 @@ struct mips_cpu_info {
|| ((TARGET_FLOAT64 \
|| mips_isa_rev >= 2) \
&& (MODE) == DFmode))) \
|| (((MODE) == SFmode \
|| (MODE) == DFmode) \
&& (mips_isa_rev >= 6)) \
|| (TARGET_SB1 \
&& (MODE) == V2SFmode)) \
&& !TARGET_MIPS16)
#define ISA_HAS_LWL_LWR (mips_isa_rev <= 5 && !TARGET_MIPS16)
#define ISA_HAS_IEEE_754_LEGACY (mips_isa_rev <= 5)
#define ISA_HAS_IEEE_754_2008 (mips_isa_rev >= 2)
/* ISA has count leading zeroes/ones instruction (not implemented). */
#define ISA_HAS_CLZ_CLO (mips_isa_rev >= 1 && !TARGET_MIPS16)
@ -1046,6 +1081,9 @@ struct mips_cpu_info {
|| mips_isa_rev >= 1) \
&& !TARGET_MIPS16)
/* ISA has data prefetch with limited 9-bit displacement. */
#define ISA_HAS_PREFETCH_9BIT (mips_isa_rev >= 6)
/* ISA has data indexed prefetch instructions. This controls use of
'prefx', along with TARGET_HARD_FLOAT and TARGET_DOUBLE_FLOAT.
(prefx is a cop1x instruction, so can only be used if FP is
@ -2133,6 +2171,7 @@ enum reg_class
#define SMALL_INT_UNSIGNED(X) SMALL_OPERAND_UNSIGNED (INTVAL (X))
#define LUI_INT(X) LUI_OPERAND (INTVAL (X))
#define UMIPS_12BIT_OFFSET_P(OFFSET) (IN_RANGE (OFFSET, -2048, 2047))
#define MIPS_9BIT_OFFSET_P(OFFSET) (IN_RANGE (OFFSET, -256, 255))
/* The HI and LO registers can only be reloaded via the general
registers. Condition code registers can only be loaded to the

View File

@ -67,6 +67,8 @@
xlr
xlp
p5600
w32
w64
])
(define_c_enum "unspec" [
@ -768,6 +770,11 @@
&& !TARGET_LOONGSON_2EF
&& !TARGET_MIPS5900")])
;; This mode iterator allows :FPCC to be used anywhere that an FP condition
;; is needed.
(define_mode_iterator FPCC [(CC "!ISA_HAS_CCF")
(CCF "ISA_HAS_CCF")])
;; 32-bit integer moves for which we provide move patterns.
(define_mode_iterator IMOVE32
[SI
@ -857,7 +864,7 @@
;; This attribute gives the best constraint to use for registers of
;; a given mode.
(define_mode_attr reg [(SI "d") (DI "d") (CC "z")])
(define_mode_attr reg [(SI "d") (DI "d") (CC "z") (CCF "f")])
;; This attribute gives the format suffix for floating-point operations.
(define_mode_attr fmt [(SF "s") (DF "d") (V2SF "ps")])
@ -897,6 +904,9 @@
(define_mode_attr sqrt_condition
[(SF "!ISA_MIPS1") (DF "!ISA_MIPS1") (V2SF "TARGET_SB1")])
;; This attribute provides the correct mnemonic for each FP condition mode.
(define_mode_attr fpcmp [(CC "c") (CCF "cmp")])
;; This code iterator allows signed and unsigned widening multiplications
;; to use the same template.
(define_code_iterator any_extend [sign_extend zero_extend])
@ -919,7 +929,10 @@
;; This code iterator allows all native floating-point comparisons to be
;; generated from the same template.
(define_code_iterator fcond [unordered uneq unlt unle eq lt le])
(define_code_iterator fcond [unordered uneq unlt unle eq lt le
(ordered "ISA_HAS_CCF")
(ltgt "ISA_HAS_CCF")
(ne "ISA_HAS_CCF")])
;; This code iterator is used for comparisons that can be implemented
;; by swapping the operands.
@ -992,7 +1005,10 @@
(unle "ule")
(eq "eq")
(lt "lt")
(le "le")])
(le "le")
(ordered "or")
(ltgt "ne")
(ne "une")])
;; Similar, but for swapped conditions.
(define_code_attr swapped_fcond [(ge "le")
@ -1006,6 +1022,10 @@
;; This is the inverse value of bbv.
(define_code_attr bbinv [(eq "1") (ne "0")])
;; The sel mnemonic to use depending on the condition test.
(define_code_attr sel [(eq "seleqz") (ne "selnez")])
(define_code_attr selinv [(eq "selnez") (ne "seleqz")])
;; .........................
;;
@ -1114,18 +1134,27 @@
[(match_operand:GPR 1 "reg_or_0_operand")
(match_operand:GPR 2 "arith_operand")])
(match_operand 3 "const_0_operand"))]
"ISA_HAS_COND_TRAP"
"ISA_HAS_COND_TRAPI || ISA_HAS_COND_TRAP"
{
mips_expand_conditional_trap (operands[0]);
DONE;
})
(define_insn "*conditional_trap_reg<mode>"
[(trap_if (match_operator:GPR 0 "trap_comparison_operator"
[(match_operand:GPR 1 "reg_or_0_operand" "dJ")
(match_operand:GPR 2 "reg_or_0_operand" "dJ")])
(const_int 0))]
"ISA_HAS_COND_TRAP && !ISA_HAS_COND_TRAPI"
"t%C0\t%z1,%2"
[(set_attr "type" "trap")])
(define_insn "*conditional_trap<mode>"
[(trap_if (match_operator:GPR 0 "trap_comparison_operator"
[(match_operand:GPR 1 "reg_or_0_operand" "dJ")
(match_operand:GPR 2 "arith_operand" "dI")])
(const_int 0))]
"ISA_HAS_COND_TRAP"
"ISA_HAS_COND_TRAPI"
"t%C0\t%z1,%2"
[(set_attr "type" "trap")])
@ -1493,13 +1522,13 @@
[(set (match_operand:GPR 0 "register_operand")
(mult:GPR (match_operand:GPR 1 "register_operand")
(match_operand:GPR 2 "register_operand")))]
"ISA_HAS_<D>MULT"
"ISA_HAS_<D>MULT || ISA_HAS_R6<D>MUL"
{
rtx lo;
if (TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A)
emit_insn (gen_mul<mode>3_mul3_loongson (operands[0], operands[1],
operands[2]));
if (TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A || ISA_HAS_R6<D>MUL)
emit_insn (gen_mul<mode>3_mul3_nohilo (operands[0], operands[1],
operands[2]));
else if (ISA_HAS_<D>MUL3)
emit_insn (gen_mul<mode>3_mul3 (operands[0], operands[1], operands[2]));
else if (TARGET_MIPS16)
@ -1516,16 +1545,18 @@
DONE;
})
(define_insn "mul<mode>3_mul3_loongson"
(define_insn "mul<mode>3_mul3_nohilo"
[(set (match_operand:GPR 0 "register_operand" "=d")
(mult:GPR (match_operand:GPR 1 "register_operand" "d")
(match_operand:GPR 2 "register_operand" "d")))]
"TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A"
"TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A || ISA_HAS_R6<D>MUL"
{
if (TARGET_LOONGSON_2EF)
return "<d>multu.g\t%0,%1,%2";
else
else if (TARGET_LOONGSON_3A)
return "gs<d>multu\t%0,%1,%2";
else
return "<d>mul\t%0,%1,%2";
}
[(set_attr "type" "imul3nc")
(set_attr "mode" "<MODE>")])
@ -1961,6 +1992,24 @@
DONE;
})
(define_expand "<u>mulsidi3_32bit_r6"
[(set (match_operand:DI 0 "register_operand")
(mult:DI (any_extend:DI (match_operand:SI 1 "register_operand"))
(any_extend:DI (match_operand:SI 2 "register_operand"))))]
"!TARGET_64BIT && ISA_HAS_R6MUL"
{
rtx dest = gen_reg_rtx (DImode);
rtx low = mips_subword (dest, 0);
rtx high = mips_subword (dest, 1);
emit_insn (gen_mulsi3_mul3_nohilo (low, operands[1], operands[2]));
emit_insn (gen_<su>mulsi3_highpart_r6 (high, operands[1], operands[2]));
emit_move_insn (mips_subword (operands[0], 0), low);
emit_move_insn (mips_subword (operands[0], 1), high);
DONE;
})
(define_expand "<u>mulsidi3_32bit_mips16"
[(set (match_operand:DI 0 "register_operand")
(mult:DI (any_extend:DI (match_operand:SI 1 "register_operand"))
@ -1982,7 +2031,7 @@
[(set (match_operand:DI 0 "muldiv_target_operand" "=ka")
(mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
(any_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
"!TARGET_64BIT && (!TARGET_FIX_R4000 || ISA_HAS_DSP)"
"!TARGET_64BIT && (!TARGET_FIX_R4000 || ISA_HAS_DSP) && ISA_HAS_MULT"
{
if (ISA_HAS_DSP_MULT)
return "mult<u>\t%q0,%1,%2";
@ -1997,7 +2046,7 @@
(mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
(any_extend:DI (match_operand:SI 2 "register_operand" "d"))))
(clobber (match_scratch:DI 3 "=x"))]
"!TARGET_64BIT && TARGET_FIX_R4000 && !ISA_HAS_DSP"
"!TARGET_64BIT && TARGET_FIX_R4000 && !ISA_HAS_DSP && ISA_HAS_MULT"
"mult<u>\t%1,%2\;mflo\t%L0\;mfhi\t%M0"
[(set_attr "type" "imul")
(set_attr "mode" "SI")
@ -2009,7 +2058,8 @@
(any_extend:DI (match_operand:SI 2 "register_operand" "d"))))
(clobber (match_scratch:TI 3 "=x"))
(clobber (match_scratch:DI 4 "=d"))]
"TARGET_64BIT && !TARGET_FIX_R4000 && !ISA_HAS_DMUL3 && !TARGET_MIPS16"
"TARGET_64BIT && !TARGET_FIX_R4000 && !ISA_HAS_DMUL3
&& !TARGET_MIPS16 && ISA_HAS_MULT"
"#"
"&& reload_completed"
[(const_int 0)]
@ -2092,6 +2142,15 @@
[(set_attr "type" "imul3")
(set_attr "mode" "DI")])
(define_insn "mulsidi3_64bit_r6dmul"
[(set (match_operand:DI 0 "register_operand" "=d")
(mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))
(sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
"ISA_HAS_R6DMUL"
"dmul\t%0,%1,%2"
[(set_attr "type" "imul3nc")
(set_attr "mode" "DI")])
;; Widening multiply with negation.
(define_insn "*muls<u>_di"
[(set (match_operand:DI 0 "muldiv_target_operand" "=x")
@ -2149,12 +2208,27 @@
else if (TARGET_MIPS16)
emit_insn (gen_<su>mulsi3_highpart_split (operands[0], operands[1],
operands[2]));
else if (ISA_HAS_R6MUL)
emit_insn (gen_<su>mulsi3_highpart_r6 (operands[0], operands[1],
operands[2]));
else
emit_insn (gen_<su>mulsi3_highpart_internal (operands[0], operands[1],
operands[2]));
DONE;
})
(define_insn "<su>mulsi3_highpart_r6"
[(set (match_operand:SI 0 "register_operand" "=d")
(truncate:SI
(lshiftrt:DI
(mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
(any_extend:DI (match_operand:SI 2 "register_operand" "d")))
(const_int 32))))]
"ISA_HAS_R6MUL"
"muh<u>\t%0,%1,%2"
[(set_attr "type" "imul3nc")
(set_attr "mode" "SI")])
(define_insn_and_split "<su>mulsi3_highpart_internal"
[(set (match_operand:SI 0 "register_operand" "=d")
(truncate:SI
@ -2163,7 +2237,7 @@
(any_extend:DI (match_operand:SI 2 "register_operand" "d")))
(const_int 32))))
(clobber (match_scratch:SI 3 "=l"))]
"!ISA_HAS_MULHI && !TARGET_MIPS16"
"ISA_HAS_MULT && !ISA_HAS_MULHI && !TARGET_MIPS16"
{ return TARGET_FIX_R4000 ? "mult<u>\t%1,%2\n\tmfhi\t%0" : "#"; }
"&& reload_completed && !TARGET_FIX_R4000"
[(const_int 0)]
@ -2241,17 +2315,34 @@
(mult:TI (any_extend:TI (match_operand:DI 1 "register_operand"))
(any_extend:TI (match_operand:DI 2 "register_operand")))
(const_int 64))))]
"ISA_HAS_DMULT && !(<CODE> == ZERO_EXTEND && TARGET_FIX_VR4120)"
"ISA_HAS_R6DMUL
|| (ISA_HAS_DMULT
&& !(<CODE> == ZERO_EXTEND && TARGET_FIX_VR4120))"
{
if (TARGET_MIPS16)
emit_insn (gen_<su>muldi3_highpart_split (operands[0], operands[1],
operands[2]));
else if (ISA_HAS_R6DMUL)
emit_insn (gen_<su>muldi3_highpart_r6 (operands[0], operands[1],
operands[2]));
else
emit_insn (gen_<su>muldi3_highpart_internal (operands[0], operands[1],
operands[2]));
DONE;
})
(define_insn "<su>muldi3_highpart_r6"
[(set (match_operand:DI 0 "register_operand" "=d")
(truncate:DI
(lshiftrt:TI
(mult:TI (any_extend:TI (match_operand:DI 1 "register_operand" "d"))
(any_extend:TI (match_operand:DI 2 "register_operand" "d")))
(const_int 64))))]
"ISA_HAS_R6DMUL"
"dmuh<u>\t%0,%1,%2"
[(set_attr "type" "imul3nc")
(set_attr "mode" "DI")])
(define_insn_and_split "<su>muldi3_highpart_internal"
[(set (match_operand:DI 0 "register_operand" "=d")
(truncate:DI
@ -2390,6 +2481,16 @@
(set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "fma<mode>4"
[(set (match_operand:ANYF 0 "register_operand" "=f")
(fma:ANYF (match_operand:ANYF 1 "register_operand" "f")
(match_operand:ANYF 2 "register_operand" "f")
(match_operand:ANYF 3 "register_operand" "0")))]
"ISA_HAS_FP_MADDF_MSUBF"
"maddf.<fmt>\t%0,%1,%2"
[(set_attr "type" "fmadd")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*madd3<mode>"
[(set (match_operand:ANYF 0 "register_operand" "=f")
(plus:ANYF (mult:ANYF (match_operand:ANYF 1 "register_operand" "f")
@ -2773,6 +2874,40 @@
{ return mips_output_division ("<GPR:d>div<u>\t%.,%1,%2", operands); }
[(set_attr "type" "idiv")
(set_attr "mode" "<GPR:MODE>")])
;; Integer division and modulus.
(define_insn "<u>div<mode>3"
[(set (match_operand:GPR 0 "register_operand" "=&d")
(any_div:GPR (match_operand:GPR 1 "register_operand" "d")
(match_operand:GPR 2 "register_operand" "d")))]
"TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A || ISA_HAS_R6<D>DIV"
{
if (TARGET_LOONGSON_2EF)
return mips_output_division ("<d>div<u>.g\t%0,%1,%2", operands);
else if (TARGET_LOONGSON_3A)
return mips_output_division ("gs<d>div<u>\t%0,%1,%2", operands);
else
return mips_output_division ("<d>div<u>\t%0,%1,%2", operands);
}
[(set_attr "type" "idiv3")
(set_attr "mode" "<MODE>")])
(define_insn "<u>mod<mode>3"
[(set (match_operand:GPR 0 "register_operand" "=&d")
(any_mod:GPR (match_operand:GPR 1 "register_operand" "d")
(match_operand:GPR 2 "register_operand" "d")))]
"TARGET_LOONGSON_2EF || TARGET_LOONGSON_3A || ISA_HAS_R6<D>DIV"
{
if (TARGET_LOONGSON_2EF)
return mips_output_division ("<d>mod<u>.g\t%0,%1,%2", operands);
else if (TARGET_LOONGSON_3A)
return mips_output_division ("gs<d>mod<u>\t%0,%1,%2", operands);
else
return mips_output_division ("<d>mod<u>\t%0,%1,%2", operands);
}
[(set_attr "type" "idiv3")
(set_attr "mode" "<MODE>")])
;;
;; ....................
@ -3918,7 +4053,7 @@
(sign_extract:GPR (match_operand:BLK 1 "memory_operand")
(match_operand 2 "const_int_operand")
(match_operand 3 "const_int_operand")))]
"!TARGET_MIPS16"
"ISA_HAS_LWL_LWR"
{
if (mips_expand_ext_as_unaligned_load (operands[0], operands[1],
INTVAL (operands[2]),
@ -3955,7 +4090,7 @@
(zero_extract:GPR (match_operand:BLK 1 "memory_operand")
(match_operand 2 "const_int_operand")
(match_operand 3 "const_int_operand")))]
"!TARGET_MIPS16"
"ISA_HAS_LWL_LWR"
{
if (mips_expand_ext_as_unaligned_load (operands[0], operands[1],
INTVAL (operands[2]),
@ -4006,7 +4141,7 @@
(match_operand 1 "const_int_operand")
(match_operand 2 "const_int_operand"))
(match_operand:GPR 3 "reg_or_0_operand"))]
"!TARGET_MIPS16"
"ISA_HAS_LWL_LWR"
{
if (mips_expand_ins_as_unaligned_store (operands[0], operands[3],
INTVAL (operands[1]),
@ -4762,6 +4897,13 @@
DONE;
})
(define_insn "movccf"
[(set (match_operand:CCF 0 "nonimmediate_operand" "=f,f,m")
(match_operand:CCF 1 "nonimmediate_operand" "f,m,f"))]
"ISA_HAS_CCF"
{ return mips_output_move (operands[0], operands[1]); }
[(set_attr "move_type" "fmove,fpload,fpstore")])
(define_insn "*movsf_hardfloat"
[(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,m,m,*f,*d,*d,*d,*m")
(match_operand:SF 1 "move_operand" "f,G,m,f,G,*d,*f,*G*d,*m,*d"))]
@ -5280,7 +5422,7 @@
(define_insn "mips_cache"
[(set (mem:BLK (scratch))
(unspec:BLK [(match_operand:SI 0 "const_int_operand")
(match_operand:QI 1 "address_operand" "p")]
(match_operand:QI 1 "address_operand" "ZD")]
UNSPEC_MIPS_CACHE))]
"ISA_HAS_CACHE"
"cache\t%X0,%a1")
@ -5557,11 +5699,11 @@
;; Conditional branches on floating-point equality tests.
(define_insn "*branch_fp"
(define_insn "*branch_fp_<mode>"
[(set (pc)
(if_then_else
(match_operator 1 "equality_operator"
[(match_operand:CC 2 "register_operand" "z")
[(match_operand:FPCC 2 "register_operand" "<reg>")
(const_int 0)])
(label_ref (match_operand 0 "" ""))
(pc)))]
@ -5573,11 +5715,11 @@
}
[(set_attr "type" "branch")])
(define_insn "*branch_fp_inverted"
(define_insn "*branch_fp_inverted_<mode>"
[(set (pc)
(if_then_else
(match_operator 1 "equality_operator"
[(match_operand:CC 2 "register_operand" "z")
[(match_operand:FPCC 2 "register_operand" "<reg>")
(const_int 0)])
(pc)
(label_ref (match_operand 0 "" ""))))]
@ -5921,21 +6063,21 @@
;;
;; ....................
(define_insn "s<code>_<mode>"
[(set (match_operand:CC 0 "register_operand" "=z")
(fcond:CC (match_operand:SCALARF 1 "register_operand" "f")
(match_operand:SCALARF 2 "register_operand" "f")))]
(define_insn "s<code>_<SCALARF:mode>_using_<FPCC:mode>"
[(set (match_operand:FPCC 0 "register_operand" "=<reg>")
(fcond:FPCC (match_operand:SCALARF 1 "register_operand" "f")
(match_operand:SCALARF 2 "register_operand" "f")))]
""
"c.<fcond>.<fmt>\t%Z0%1,%2"
"<fpcmp>.<fcond>.<fmt>\t%Z0%1,%2"
[(set_attr "type" "fcmp")
(set_attr "mode" "FPSW")])
(define_insn "s<code>_<mode>"
[(set (match_operand:CC 0 "register_operand" "=z")
(swapped_fcond:CC (match_operand:SCALARF 1 "register_operand" "f")
(match_operand:SCALARF 2 "register_operand" "f")))]
(define_insn "s<code>_<SCALARF:mode>_using_<FPCC:mode>"
[(set (match_operand:FPCC 0 "register_operand" "=<reg>")
(swapped_fcond:FPCC (match_operand:SCALARF 1 "register_operand" "f")
(match_operand:SCALARF 2 "register_operand" "f")))]
""
"c.<swapped_fcond>.<fmt>\t%Z0%2,%1"
"<fpcmp>.<swapped_fcond>.<fmt>\t%Z0%2,%1"
[(set_attr "type" "fcmp")
(set_attr "mode" "FPSW")])
@ -6953,6 +7095,41 @@
[(set_attr "type" "condmove")
(set_attr "mode" "<SCALARF:MODE>")])
(define_insn "*sel<code><GPR:mode>_using_<GPR2:mode>"
[(set (match_operand:GPR 0 "register_operand" "=d,d")
(if_then_else:GPR
(equality_op:GPR2 (match_operand:GPR2 1 "register_operand" "d,d")
(const_int 0))
(match_operand:GPR 2 "reg_or_0_operand" "d,J")
(match_operand:GPR 3 "reg_or_0_operand" "J,d")))]
"ISA_HAS_SEL
&& (register_operand (operands[2], <GPR:MODE>mode)
!= register_operand (operands[3], <GPR:MODE>mode))"
"@
<sel>\t%0,%2,%1
<selinv>\t%0,%3,%1"
[(set_attr "type" "condmove")
(set_attr "mode" "<GPR:MODE>")])
;; sel.fmt copies the 3rd argument when the 1st is non-zero and the 2nd
;; argument if the 1st is zero. This means operand 2 and 3 are
;; inverted in the instruction.
(define_insn "*sel<mode>"
[(set (match_operand:SCALARF 0 "register_operand" "=f,f,f")
(if_then_else:SCALARF
(ne:CCF (match_operand:CCF 1 "register_operand" "0,f,f")
(const_int 0))
(match_operand:SCALARF 2 "reg_or_0_operand" "f,G,f")
(match_operand:SCALARF 3 "reg_or_0_operand" "f,f,G")))]
"ISA_HAS_SEL && ISA_HAS_CCF"
"@
sel.<fmt>\t%0,%3,%2
seleqz.<fmt>\t%0,%3,%1
selnez.<fmt>\t%0,%2,%1"
[(set_attr "type" "condmove")
(set_attr "mode" "<SCALARF:MODE>")])
;; These are the main define_expand's used to make conditional moves.
(define_expand "mov<mode>cc"
@ -6961,8 +7138,11 @@
(if_then_else:GPR (match_dup 5)
(match_operand:GPR 2 "reg_or_0_operand")
(match_operand:GPR 3 "reg_or_0_operand")))]
"ISA_HAS_CONDMOVE"
"ISA_HAS_CONDMOVE || ISA_HAS_SEL"
{
if (ISA_HAS_SEL && !INTEGRAL_MODE_P (GET_MODE (XEXP (operands[1], 0))))
FAIL;
mips_expand_conditional_move (operands);
DONE;
})
@ -6971,10 +7151,25 @@
[(set (match_dup 4) (match_operand 1 "comparison_operator"))
(set (match_operand:SCALARF 0 "register_operand")
(if_then_else:SCALARF (match_dup 5)
(match_operand:SCALARF 2 "register_operand")
(match_operand:SCALARF 3 "register_operand")))]
"ISA_HAS_FP_CONDMOVE"
(match_operand:SCALARF 2 "reg_or_0_operand")
(match_operand:SCALARF 3 "reg_or_0_operand")))]
"ISA_HAS_FP_CONDMOVE
|| (ISA_HAS_SEL && ISA_HAS_CCF)"
{
if (ISA_HAS_SEL && !FLOAT_MODE_P (GET_MODE (XEXP (operands[1], 0))))
FAIL;
/* Workaround an LRA bug which means that tied operands in the sel.fmt
pattern lead to the double precision destination of sel.d getting
reloaded with the full register file usable and the restrictions on
whether the CCFmode input can be used in odd-numbered single-precision
registers are ignored. For consistency reasons the CCF mode values
must be guaranteed to only exist in the even-registers because of
the unusual duality between single and double precision values. */
if (ISA_HAS_SEL && <MODE>mode == DFmode
&& (!TARGET_ODD_SPREG || TARGET_FLOATXX))
FAIL;
mips_expand_conditional_move (operands);
DONE;
})
@ -7089,7 +7284,12 @@
[(set (reg:P TLS_GET_TP_REGNUM)
(unspec:P [(const_int 0)] UNSPEC_TLS_GET_TP))]
"HAVE_AS_TLS && !TARGET_MIPS16"
".set\tpush\;.set\tmips32r2\t\;rdhwr\t$3,$29\;.set\tpop"
{
if (mips_isa_rev >= 2)
return "rdhwr\t$3,$29";
return ".set\tpush\;.set\tmips32r2\t\;rdhwr\t$3,$29\;.set\tpop";
}
[(set_attr "type" "unknown")
; Since rdhwr always generates a trap for now, putting it in a delay
; slot would make the kernel's emulation of it much slower.

View File

@ -84,21 +84,13 @@ along with GCC; see the file COPYING3. If not see
builtin_define ("__mips=3"); \
else if (ISA_MIPS4) \
builtin_define ("__mips=4"); \
else if (ISA_MIPS32) \
{ \
builtin_define ("__mips=32"); \
builtin_define ("__mips_isa_rev=1"); \
} \
else if (ISA_MIPS32R2) \
{ \
builtin_define ("__mips=32"); \
builtin_define ("__mips_isa_rev=2"); \
} \
else if (ISA_MIPS64) \
{ \
builtin_define ("__mips=64"); \
builtin_define ("__mips_isa_rev=1"); \
} \
else if (mips_isa >= 32 && mips_isa < 64) \
builtin_define ("__mips=32"); \
else if (mips_isa >= 64) \
builtin_define ("__mips=64"); \
if (mips_isa_rev > 0) \
builtin_define_with_int_value ("__mips_isa_rev", \
mips_isa_rev); \
\
if (TARGET_HARD_FLOAT) \
builtin_define ("__mips_hard_float"); \
@ -141,7 +133,8 @@ along with GCC; see the file COPYING3. If not see
"%{EL:-m elf32lmip} \
%{EB:-m elf32bmip} \
%(endian_spec) \
%{G*} %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips32r2} %{mips64} \
%{G*} %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips32r2} \
%{mips32r6} %{mips64} %{mips64r6} \
%(netbsd_link_spec)"
#define NETBSD_ENTRY_POINT "__start"

View File

@ -22,10 +22,10 @@ ifneq ($(filter MIPS_ABI_DEFAULT=ABI_EABI,$(tm_defines)),)
MULTILIB_OPTIONS = msoft-float EL/EB mips32/mips32r2/mips64/mips64r2
MULTILIB_DIRNAMES = soft-float el eb mips32 mips32r2 mips64 mips64r2
else
MULTILIB_OPTIONS = msoft-float/mfp64 EL/EB mips32/mips32r2/mips64/mips64r2
MULTILIB_DIRNAMES = soft-float fp64 el eb mips32 mips32r2 mips64 mips64r2
MULTILIB_OPTIONS = msoft-float/mfp64 EL/EB mips32/mips32r2/mips32r6/mips64/mips64r2/mips64r6
MULTILIB_DIRNAMES = soft-float fp64 el eb mips32 mips32r2 mips32r6 mips64 mips64r2 mips64r6
ifneq ($(filter MIPS_ISA_DEFAULT=33,$(tm_defines)),)
MULTILIB_EXCLUSIONS = mips32/mfp64 mips64/mfp64 mips64r2/mfp64
MULTILIB_EXCLUSIONS = mips32/mfp64 mips64/mfp64 mips64r2/mfp64 mips32r6/mfp64 mips64r6/mfp64
else
MULTILIB_EXCLUSIONS = !mips32r2/mfp64
endif

View File

@ -785,7 +785,7 @@ Objective-C and Objective-C++ Dialects}.
@emph{MIPS Options}
@gccoptlist{-EL -EB -march=@var{arch} -mtune=@var{arch} @gol
-mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips32r3 -mips32r5 @gol
-mips64 -mips64r2 -mips64r3 -mips64r5 @gol
-mips32r6 -mips64 -mips64r2 -mips64r3 -mips64r5 -mips64r6 @gol
-mips16 -mno-mips16 -mflip-mips16 @gol
-minterlink-compressed -mno-interlink-compressed @gol
-minterlink-mips16 -mno-interlink-mips16 @gol
@ -17671,8 +17671,9 @@ Generate code that runs on @var{arch}, which can be the name of a
generic MIPS ISA, or the name of a particular processor.
The ISA names are:
@samp{mips1}, @samp{mips2}, @samp{mips3}, @samp{mips4},
@samp{mips32}, @samp{mips32r2}, @samp{mips32r3}, @samp{mips32r5},
@samp{mips64}, @samp{mips64r2}, @samp{mips64r3} and @samp{mips64r5}.
@samp{mips32}, @samp{mips32r2}, @samp{mips32r3}, @samp{mips32r5},
@samp{mips32r6}, @samp{mips64}, @samp{mips64r2}, @samp{mips64r3},
@samp{mips64r5} and @samp{mips64r6}.
The processor names are:
@samp{4kc}, @samp{4km}, @samp{4kp}, @samp{4ksc},
@samp{4kec}, @samp{4kem}, @samp{4kep}, @samp{4ksd},
@ -17779,6 +17780,10 @@ Equivalent to @option{-march=mips32r3}.
@opindex mips32r5
Equivalent to @option{-march=mips32r5}.
@item -mips32r6
@opindex mips32r6
Equivalent to @option{-march=mips32r6}.
@item -mips64
@opindex mips64
Equivalent to @option{-march=mips64}.
@ -17795,6 +17800,10 @@ Equivalent to @option{-march=mips64r3}.
@opindex mips64r5
Equivalent to @option{-march=mips64r5}.
@item -mips64r6
@opindex mips64r6
Equivalent to @option{-march=mips64r6}.
@item -mips16
@itemx -mno-mips16
@opindex mips16

View File

@ -2994,10 +2994,8 @@ operands can be used for microMIPS instructions such as @code{ll} and
equivalent to @code{R}.
@item ZD
When compiling microMIPS code, this constraint matches an address operand
that is formed from a base register and a 12-bit offset. These operands
can be used for microMIPS instructions such as @code{prefetch}. When
not compiling for microMIPS code, @code{ZD} is equivalent to @code{p}.
An address suitable for a @code{prefetch} instruction, or for any other
instruction with the same addressing mode as @code{prefetch}.
@end table
@item Motorola 680x0---@file{config/m68k/constraints.md}

View File

@ -1,3 +1,31 @@
2014-12-19 Matthew Fortune <matthew.fortune@imgtec.com>
Steve Ellcey <sellcey@imgtec.com>
* gcc.dg/torture/mips-hilo-2.c: Unconditionally pass for R6 onwards.
* gcc.dg/torture/pr19683-1.c: Likewise.
* gcc.target/mips/branch-cost-2.c: Require MOVN.
* gcc.target/mips/movcc-1.c: Likewise.
* gcc.target/mips/movcc-2.c: Likewise.
* gcc.target/mips/movcc-3.c: Likewise.
* gcc.target/mips/call-saved-4.c: Require LDC.
* gcc.target/mips/dmult-1.c: Require R5 or earlier.
* gcc.target/mips/fpcmp-1.c: Likewise.
* gcc.target/mips/fpcmp-2.c: Likewise.
* gcc.target/mips/neg-abs-2.c: Likewise.
* gcc.target/mips/timode-1.c: Likewise.
* gcc.target/mips/unaligned-1.c: Likewise.
* gcc.target/mips/madd-3.c: Require MADD.
* gcc.target/mips/madd-9.c: Likewise.
* gcc.target/mips/maddu-3.c: Likewise.
* gcc.target/mips/msub-3.c: Likewise.
* gcc.target/mips/msubu-3.c: Likewise.
* gcc.target/mips/mult-1.c: Require INS and not DMUL.
* gcc.target/mips/mips-ps-type-2.c: Require MADD.PS.
* gcc.target/mips/mips.exp (mips_option_groups): Add ins, dmul, ldc,
movn, madd, maddps.
(mips-dg-options): INS available from R2. LDC available from MIPS II,
DMUL is present in octeon. Describe all features removed from R6.
2014-12-19 Janus Weil <janus@gcc.gnu.org>
PR fortran/64209

View File

@ -5,6 +5,7 @@
extern void abort (void);
extern void exit (int);
#if __mips_isa_rev <= 5
unsigned int g;
unsigned __attribute__ ((nomips16)) long long f (unsigned int x)
@ -15,13 +16,16 @@ unsigned __attribute__ ((nomips16)) long long f (unsigned int x)
asm ("mflo\t%0" : "=r" (g) : "l" (u.parts[1]));
return u.ll;
}
#endif
int __attribute__ ((nomips16)) main ()
{
#if __mips_isa_rev <= 5
union { unsigned long long ll; unsigned int parts[2]; } u;
u.ll = f (0x12345678);
if (g != u.parts[1])
abort ();
#endif
exit (0);
}

View File

@ -14,6 +14,7 @@ extern void exit (int);
#define IN(X) unsigned int x##X = ptr[0]
#define OUT(X) ptr[0] = x##X
#if __mips_isa_rev <= 5
union u { unsigned long long ll; unsigned int i[2]; };
unsigned int __attribute__ ((nomips16))
@ -28,15 +29,18 @@ foo (volatile unsigned int *ptr)
asm ("#" : "=l" (result) : "l" (u.i[1]));
return result;
}
#endif
int __attribute__ ((nomips16))
main (void)
{
#if __mips_isa_rev <= 5
unsigned int array[] = { 1000 * 1000 * 1000 };
union u u;
u.ll = (unsigned long long) array[0] * array[0];
if (foo (array) != u.i[1])
abort ();
#endif
exit (0);
}

View File

@ -24,7 +24,7 @@ int foo (float inf, int64 in64, int32 in32)
abort ();
#endif
#if (__mips == 4 || __mips == 32 || __mips == 64) && !defined (__mips16)
#if (__mips == 4 || ((__mips == 32 || __mips == 64) && __mips_isa_rev < 6)) && !defined (__mips16)
__asm__ ("move %0,%.\n\tmovn %0,%1,%2"
: "=&r" (res32) : "r" (in32), "r" (in64 != 0));
if (res32 != 60)

View File

@ -1,4 +1,4 @@
/* { dg-options "-mbranch-cost=10 isa>=4" } */
/* { dg-options "-mbranch-cost=10 (HAS_MOVN)" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
NOMIPS16 int
foo (int x, int y, int z, int k)

View File

@ -1,5 +1,5 @@
/* Check that we save the correct call-saved GPRs and FPRs. */
/* { dg-options "isa>=2 -mabi=32 -mfp32" } */
/* { dg-options "(HAS_LDC) -mabi=32 -mfp32" } */
void bar (void);

View File

@ -1,4 +1,4 @@
/* { dg-options "forbid_cpu=octeon.* -mgp64" } */
/* { dg-options "isa_rev<=5 forbid_cpu=octeon.* -mgp64" } */
/* { dg-final { scan-assembler "\tdmult\t" } } */
/* { dg-final { scan-assembler "\tmflo\t" } } */
/* { dg-final { scan-assembler-not "\tdmul\t" } } */

View File

@ -1,5 +1,5 @@
/* We used to use c.lt.fmt instead of c.ule.fmt here. */
/* { dg-options "-mhard-float" } */
/* { dg-options "isa_rev<=5 -mhard-float" } */
NOMIPS16 int f1 (float x, float y) { return __builtin_isless (x, y); }
NOMIPS16 int f2 (double x, double y) { return __builtin_isless (x, y); }
/* { dg-final { scan-assembler "\tc\\.ule\\.s\t" } } */

View File

@ -1,5 +1,5 @@
/* We used to use c.le.fmt instead of c.ult.fmt here. */
/* { dg-options "-mhard-float" } */
/* { dg-options "isa_rev<=5 -mhard-float" } */
NOMIPS16 int f1 (float x, float y) { return __builtin_islessequal (x, y); }
NOMIPS16 int f2 (double x, double y) { return __builtin_islessequal (x, y); }
/* { dg-final { scan-assembler "\tc\\.ult\\.s\t" } } */

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */
/* { dg-options "isa_rev>=1 -mgp32" } */
/* { dg-options "(HAS_MADD) -mgp32" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler-times "\tmadd\t" 3 } } */

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */
/* { dg-options "isa_rev>=1 -mgp32 -mtune=4kc" } */
/* { dg-options "(HAS_MADD) -mgp32 -mtune=4kc" } */
/* References to X within the loop need to have a higher frequency than
references to X outside the loop, otherwise there is no reason
to prefer multiply/accumulator registers over GPRs. */

View File

@ -1,6 +1,6 @@
/* { dg-do compile } */
/* This test requires widening_mul */
/* { dg-options "isa_rev>=1 -mgp32 -fexpensive-optimizations" } */
/* { dg-options "(HAS_MADD) -mgp32 -fexpensive-optimizations" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler-times "\tmaddu\t" 3 } } */

View File

@ -1,7 +1,7 @@
/* Test v2sf calculations. The nmadd and nmsub patterns need
-ffinite-math-only. */
/* { dg-do compile } */
/* { dg-options "isa_rev>=2 -mgp32 -mpaired-single -ffinite-math-only" } */
/* { dg-options "(HAS_MADDPS) -mgp32 -mpaired-single -ffinite-math-only" } */
/* { dg-skip-if "nmadd and nmsub need combine" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler "\tcvt.ps.s\t" } } */
/* { dg-final { scan-assembler "\tmov.ps\t" } } */

View File

@ -247,6 +247,12 @@ set mips_option_groups {
small-data "-G[0-9]+"
warnings "-w"
dump "-fdump-.*"
ins "HAS_INS"
dmul "NOT_HAS_DMUL"
ldc "HAS_LDC"
movn "HAS_MOVN"
madd "HAS_MADD"
maddps "HAS_MADDPS"
}
for { set option 0 } { $option < 32 } { incr option } {
@ -1063,6 +1069,9 @@ proc mips-dg-options { args } {
&& (($gp_size == 32 && [mips_have_test_option_p options "-mfp64"])
|| [mips_have_test_option_p options "-msynci"]
|| [mips_have_test_option_p options "-mdsp"]
|| [mips_have_test_option_p options "HAS_INS"]
|| [mips_have_test_option_p options "HAS_MADD"]
|| [mips_have_test_option_p options "HAS_MADDPS"]
|| [mips_have_test_option_p options "-mdspr2"]) } {
if { $gp_size == 32 } {
mips_make_test_option options "-mips32r2"
@ -1084,6 +1093,12 @@ proc mips-dg-options { args } {
} else {
mips_make_test_option options "-mips64"
}
# We need MIPS IV or higher for:
#
#
} elseif { $isa < 3
&& [mips_have_test_option_p options "HAS_MOVN"] } {
mips_make_test_option options "-mips4"
# We need MIPS III or higher for:
#
# - the "cache" instruction
@ -1102,8 +1117,38 @@ proc mips-dg-options { args } {
&& ([mips_have_test_option_p options "-mbranch-likely"]
|| [mips_have_test_option_p options "-mfix-r10000"]
|| ($gp_size == 32
&& [mips_have_test_option_p options "-mfpxx"])) } {
&& ([mips_have_test_option_p options "-mfpxx"]
|| [mips_have_test_option_p options "HAS_LDC"]))) } {
mips_make_test_option options "-mips2"
# We need to use octeon's base ISA if a test must not run with an
# architecture that supports dmul.
} elseif { [regexp -- "^-march=octeon.*\$" $arch]
&& [mips_have_test_option_p options "NOT_HAS_DMUL"] } {
mips_make_test_option options "-mips${isa}r${isa_rev}"
# Check whether we need to switch from mips*r6 down to mips*r5 due
# to options that are incompatible with mips*r6. If we do, use
# -mnan=2008 because r6 is nan2008 by default and without this flag
# tests that include stdlib.h will fail due to not finding
# stubs-o32_hard.h (r6 compilers only have stubs-o32_hard_2008.h)
} elseif { $isa_rev > 5
&& ([mips_have_test_option_p options "-mdsp"]
|| [mips_have_test_option_p options "-mdspr2"]
|| [mips_have_test_option_p options "-mips16"]
|| [mips_have_test_option_p options "-mmicromips"]
|| [mips_have_test_option_p options "-mfp32"]
|| [mips_have_test_option_p options "-mfix-r10000"]
|| [mips_have_test_option_p options "NOT_HAS_DMUL"]
|| [mips_have_test_option_p options "HAS_MOVN"]
|| [mips_have_test_option_p options "HAS_MADD"]
|| [mips_have_test_option_p options "-mpaired-single"]
|| [mips_have_test_option_p options "-mnan=legacy"]
|| [mips_have_test_option_p options "-mabs=legacy"]) } {
if { $gp_size == 32 } {
mips_make_test_option options "-mips32r5"
} else {
mips_make_test_option options "-mips64r5"
}
mips_make_test_option options "-mnan=2008"
# Check whether we need to switch from a 32-bit processor to the
# "nearest" 64-bit processor.
} elseif { $gp_size == 64 && [mips_32bit_arch_p $arch] } {
@ -1128,6 +1173,10 @@ proc mips-dg-options { args } {
unset isa_rev
}
# Re-calculate the isa_rev for use in the abi handling code below
set arch [mips_option options arch]
set isa_rev [mips_arch_info $arch isa_rev]
# Set an appropriate ABI, handling dependencies between the pre-abi
# options and the abi options. This should mirror the abi and post-abi
# code below.
@ -1192,8 +1241,8 @@ proc mips-dg-options { args } {
if { $abi_test_option_p } {
if { $eabi_p } {
mips_make_test_option options "-mno-abicalls"
if { $gp_size == 32 } {
mips_make_test_option options "-mfp32"
if { $isa_rev < 6 && $gp_size == 32 } {
mips_make_test_option options "-mfp32"
}
}
if { [mips_using_mips16_p options]
@ -1238,6 +1287,17 @@ proc mips-dg-options { args } {
mips_make_test_option options "-mno-dsp"
mips_make_test_option options "-mno-synci"
}
if { $isa_rev > 5 } {
mips_make_test_option options "-mno-dsp"
mips_make_test_option options "-mno-mips16"
if { [mips_have_test_option_p options "-mdsp"] } {
mips_make_test_option options "-mfp64"
}
mips_make_test_option options "-mno-fix-r10000"
mips_make_test_option options "-mno-paired-single"
mips_make_test_option options "-mnan=2008"
mips_make_test_option options "-mabs=2008"
}
unset arch
unset isa
unset isa_rev

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */
/* { dg-options "isa>=4" } */
/* { dg-options "(HAS_MOVN)" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler "\tmovz\t" } } */
/* { dg-final { scan-assembler "\tmovn\t" } } */

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */
/* { dg-options "isa>=4" } */
/* { dg-options "(HAS_MOVN)" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler "\tmovz\t" } } */
/* { dg-final { scan-assembler "\tmovn\t" } } */

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */
/* { dg-options "isa>=4 -mhard-float" } */
/* { dg-options "(HAS_MOVN) -mhard-float" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler "\tmovt\t" } } */
/* { dg-final { scan-assembler "\tmovf\t" } } */

View File

@ -1,6 +1,6 @@
/* { dg-do compile } */
/* This test requires widening_mul */
/* { dg-options "isa_rev>=1 -mgp32 -fexpensive-optimizations" } */
/* { dg-options "(HAS_MADD) -mgp32 -fexpensive-optimizations" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler-times "\tmsub\t" 2 } } */

View File

@ -1,6 +1,6 @@
/* { dg-do compile } */
/* This test requires widening_mul */
/* { dg-options "isa_rev>=1 -mgp32 -fexpensive-optimizations" } */
/* { dg-options "(HAS_MADD) -mgp32 -fexpensive-optimizations" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler-times "\tmsubu\t" 2 } } */

View File

@ -1,7 +1,7 @@
/* For SI->DI widening multiplication we should use DINS to combine the two
halves. For Octeon use DMUL with explicit widening. */
/* This test requires widening_mul */
/* { dg-options "-mgp64 isa_rev>=2 forbid_cpu=octeon.* -fexpensive-optimizations" } */
/* { dg-options "-mgp64 (HAS_INS) (NOT_HAS_DMUL) -fexpensive-optimizations" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler "\tdins\t" } } */
/* { dg-final { scan-assembler-not "\tdsll\t" } } */

View File

@ -1,7 +1,7 @@
/* Make sure that we avoid abs.fmt and neg.fmt when the signs of NaNs
matter. */
/* { dg-do compile } */
/* { dg-options "-mhard-float -fno-finite-math-only" } */
/* { dg-options "isa_rev<=5 -mhard-float -fno-finite-math-only -mabs=legacy" } */
/* { dg-final { scan-assembler-not "\tneg.s\t" } } */
/* { dg-final { scan-assembler-not "\tneg.d\t" } } */
/* { dg-final { scan-assembler-not "\tabs.s\t" } } */

View File

@ -1,4 +1,4 @@
/* { dg-options "-mgp64" } */
/* { dg-options "isa_rev<=5 -mgp64" } */
/* { dg-skip-if "we deliberately use calls when optimizing for size" { *-*-* } { "-Os" } { "" } } */
typedef int int128_t __attribute__((mode(TI)));
typedef unsigned int uint128_t __attribute__((mode(TI)));

View File

@ -1,4 +1,4 @@
/* { dg-options "-mgp64" } */
/* { dg-options "isa_rev<=5 -mgp64" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* { dg-final { scan-assembler-times "\tsdl\t" 1 } } */
/* { dg-final { scan-assembler-times "\tsdr\t" 1 } } */

View File

@ -1,3 +1,8 @@
2014-12-19 Matthew Fortune <matthew.fortune@imgtec.com>
* config.host: Support mipsisa32r6 and mipsisa64r6.
* config/mips/mips16.S: Do not build for R6.
2014-12-17 Oleg Endo <olegendo@gcc.gnu.org>
* config/sh/crt.h: New.

View File

@ -827,8 +827,10 @@ mips*-sde-elf*)
;;
mipsisa32-*-elf* | mipsisa32el-*-elf* | \
mipsisa32r2-*-elf* | mipsisa32r2el-*-elf* | \
mipsisa32r6-*-elf* | mipsisa32r6el-*-elf* | \
mipsisa64-*-elf* | mipsisa64el-*-elf* | \
mipsisa64r2-*-elf* | mipsisa64r2el-*-elf*)
mipsisa64r2-*-elf* | mipsisa64r2el-*-elf* | \
mipsisa64r6-*-elf* | mipsisa64r6el-*-elf*)
tmake_file="$tmake_file mips/t-elf mips/t-crtstuff mips/t-mips16"
extra_parts="$extra_parts crti.o crtn.o"
;;

View File

@ -23,12 +23,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "auto-host.h"
#if defined(__mips_micromips) || defined(__mips_soft_float)
#if defined(__mips_micromips) || defined(__mips_soft_float) \
|| __mips_isa_rev >= 6
/* Do nothing because this code is only needed when linking
against mips16 hard-float objects. Neither micromips code
nor soft-float code can be linked against mips16 hard-float
objects so we do not need these routines when building libgcc
for those cases. */
nor soft-float nor MIPS R6 code can be linked against mips16
hard-float objects so we do not need these routines when
building libgcc for those cases. */
#else
#if defined(HAVE_AS_MODULE)