Commit 690c229f by Michael Meissner Committed by Michael Meissner

re PR target/60735 (GCC targeting E500 with SPE has errors with the _Decimal64 type)

2014-04-02  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/60735
	* config/rs6000/rs6000.c (rs6000_hard_regno_mode_ok): If we have
	software floating point or no floating point registers, do not
	allow any type in the FPRs.  Eliminate a test for SPE SIMD types
	in GPRs that occurs after we tested for GPRs that would never be
	true.

	* config/rs6000/rs6000.md (mov<mode>_softfloat32, FMOVE64):
	Rewrite tests to use TARGET_DOUBLE_FLOAT and TARGET_E500_DOUBLE,
	since the FMOVE64 type is DFmode/DDmode.  If TARGET_E500_DOUBLE,
	specifically allow DDmode, since that does not use the SPE SIMD
	instructions.

From-SVN: r209025
parent 7b59ff2d
2014-04-02 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/60735
* config/rs6000/rs6000.c (rs6000_hard_regno_mode_ok): If we have
software floating point or no floating point registers, do not
allow any type in the FPRs. Eliminate a test for SPE SIMD types
in GPRs that occurs after we tested for GPRs that would never be
true.
* config/rs6000/rs6000.md (mov<mode>_softfloat32, FMOVE64):
Rewrite tests to use TARGET_DOUBLE_FLOAT and TARGET_E500_DOUBLE,
since the FMOVE64 type is DFmode/DDmode. If TARGET_E500_DOUBLE,
specifically allow DDmode, since that does not use the SPE SIMD
instructions.
2014-04-02 Richard Biener <rguenther@suse.de> 2014-04-02 Richard Biener <rguenther@suse.de>
PR middle-end/60729 PR middle-end/60729
......
...@@ -1752,6 +1752,9 @@ rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode) ...@@ -1752,6 +1752,9 @@ rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
modes and DImode. */ modes and DImode. */
if (FP_REGNO_P (regno)) if (FP_REGNO_P (regno))
{ {
if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
return 0;
if (SCALAR_FLOAT_MODE_P (mode) if (SCALAR_FLOAT_MODE_P (mode)
&& (mode != TDmode || (regno % 2) == 0) && (mode != TDmode || (regno % 2) == 0)
&& FP_REGNO_P (last_regno)) && FP_REGNO_P (last_regno))
...@@ -1780,10 +1783,6 @@ rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode) ...@@ -1780,10 +1783,6 @@ rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
return (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode) return (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
|| mode == V1TImode); || mode == V1TImode);
/* ...but GPRs can hold SIMD data on the SPE in one register. */
if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
return 1;
/* We cannot put non-VSX TImode or PTImode anywhere except general register /* We cannot put non-VSX TImode or PTImode anywhere except general register
and it must be able to fit within the register set. */ and it must be able to fit within the register set. */
......
...@@ -9394,8 +9394,9 @@ ...@@ -9394,8 +9394,9 @@
[(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=Y,r,r,r,r,r") [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=Y,r,r,r,r,r")
(match_operand:FMOVE64 1 "input_operand" "r,Y,r,G,H,F"))] (match_operand:FMOVE64 1 "input_operand" "r,Y,r,G,H,F"))]
"! TARGET_POWERPC64 "! TARGET_POWERPC64
&& ((TARGET_FPRS && TARGET_SINGLE_FLOAT) && ((TARGET_FPRS && TARGET_DOUBLE_FLOAT)
|| TARGET_SOFT_FLOAT || TARGET_E500_SINGLE) || TARGET_SOFT_FLOAT
|| (<MODE>mode == DDmode && TARGET_E500_DOUBLE))
&& (gpc_reg_operand (operands[0], <MODE>mode) && (gpc_reg_operand (operands[0], <MODE>mode)
|| gpc_reg_operand (operands[1], <MODE>mode))" || gpc_reg_operand (operands[1], <MODE>mode))"
"#" "#"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment