re PR bootstrap/77993 (bootstrap failure on PowerPC/Linux)
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Thu, 3 Nov 2016 21:25:12 +0000 (21:25 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Thu, 3 Nov 2016 21:25:12 +0000 (21:25 +0000)
2016-11-03  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/77993
* config/rs6000/rs6000.h (FLOAT128_IBM_P): Do not allow IFmode or
ICmode unless we have standard PowerPC floating point.
* config/rs6000/rs6000.md (FP iterator): Likewise.
(FMOVE128 iterator): Likewise.

From-SVN: r241833

gcc/ChangeLog
gcc/config/rs6000/rs6000.h
gcc/config/rs6000/rs6000.md

index 14486af..b45b91d 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-03  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/77993
+       * config/rs6000/rs6000.h (FLOAT128_IBM_P): Do not allow IFmode or
+       ICmode unless we have standard PowerPC floating point.
+       * config/rs6000/rs6000.md (FP iterator): Likewise.
+       (FMOVE128 iterator): Likewise.
+
 2016-11-03  Jakub Jelinek  <jakub@redhat.com>
            Alexandre Oliva  <aoliva@redhat.com>
            Jason Merrill  <jason@redhat.com>
index 4b83abd..2d0dd62 100644 (file)
@@ -442,14 +442,15 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
    point.  KFmode was added as a way to represent IEEE 128-bit floating point,
    even if the default for long double is the IBM long double format.
    Similarly IFmode is the IBM long double format even if the default is IEEE
-   128-bit.  */
+   128-bit.  Don't allow IFmode if -msoft-float.  */
 #define FLOAT128_IEEE_P(MODE)                                          \
   ((TARGET_IEEEQUAD && ((MODE) == TFmode || (MODE) == TCmode))         \
    || ((MODE) == KFmode) || ((MODE) == KCmode))
 
 #define FLOAT128_IBM_P(MODE)                                           \
   ((!TARGET_IEEEQUAD && ((MODE) == TFmode || (MODE) == TCmode))                \
-   || ((MODE) == IFmode) || ((MODE) == ICmode))
+   || (TARGET_HARD_FLOAT && TARGET_FPRS                                        \
+       && ((MODE) == IFmode) || ((MODE) == ICmode)))
 
 /* Helper macros to say whether a 128-bit floating point type can go in a
    single vector register, or whether it needs paired scalar values.  */
index bc8e52d..43270f8 100644 (file)
   (TF "TARGET_HARD_FLOAT
    && (TARGET_FPRS || TARGET_E500_DOUBLE)
    && TARGET_LONG_DOUBLE_128")
-  (IF "TARGET_LONG_DOUBLE_128")
+  (IF "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128")
   (KF "TARGET_FLOAT128_TYPE")
   (DD "TARGET_DFP")
   (TD "TARGET_DFP")])
 (define_mode_iterator FMOVE64 [DF DD])
 (define_mode_iterator FMOVE64X [DI DF DD])
 (define_mode_iterator FMOVE128 [(TF "TARGET_LONG_DOUBLE_128")
-                               (IF "TARGET_LONG_DOUBLE_128")
+                               (IF "FLOAT128_IBM_P (IFmode)")
                                (TD "TARGET_HARD_FLOAT && TARGET_FPRS")])
 
 (define_mode_iterator FMOVE128_FPR [(TF "FLOAT128_2REG_P (TFmode)")