]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/60735 (GCC targeting E500 with SPE has errors with the _Decima...
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Fri, 4 Apr 2014 15:14:01 +0000 (15:14 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Fri, 4 Apr 2014 15:14:01 +0000 (15:14 +0000)
[gcc]

2014-04-04  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

Back port mainline subversion id 209025.
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: r209116

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 4e964ff7de3c491e3ee84886fc51038ed021fa47..d68a8b969e0abbfec480b83d9581fe492099313c 100644 (file)
@@ -1,3 +1,21 @@
+2014-04-04  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       Back port mainline subversion id 209025.
+       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-04  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline r205308
index b257ab1cc9bbb53214090ca7ae01c92fc8ccc58d..28e370ed28f2df2737679206aa5ddf86a5ae6c81 100644 (file)
@@ -1733,6 +1733,9 @@ rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
      modes and DImode.  */
   if (FP_REGNO_P (regno))
     {
+      if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
+       return 0;
+
       if (SCALAR_FLOAT_MODE_P (mode)
          && (mode != TDmode || (regno % 2) == 0)
          && FP_REGNO_P (last_regno))
@@ -1761,10 +1764,6 @@ rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
     return (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
            || 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
      and it must be able to fit within the register set.  */
 
index 359f088035b5ce7ca2a6b330f70fcf7a78a9f779..23c7d4cda029aa59f0c2e61ae3e6f5fd640dcf96 100644 (file)
   [(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"))]
   "! TARGET_POWERPC64 
-   && ((TARGET_FPRS && TARGET_SINGLE_FLOAT) 
-       || TARGET_SOFT_FLOAT || TARGET_E500_SINGLE)
+   && ((TARGET_FPRS && TARGET_DOUBLE_FLOAT) 
+       || TARGET_SOFT_FLOAT
+       || (<MODE>mode == DDmode && TARGET_E500_DOUBLE))
    && (gpc_reg_operand (operands[0], <MODE>mode)
        || gpc_reg_operand (operands[1], <MODE>mode))"
   "#"