From 0bc36dec0f6a5d73b79e78c549533261b76602ec Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Thu, 3 Nov 2016 21:25:12 +0000 Subject: [PATCH] re PR bootstrap/77993 (bootstrap failure on PowerPC/Linux) 2016-11-03 Michael Meissner 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 | 8 ++++++++ gcc/config/rs6000/rs6000.h | 5 +++-- gcc/config/rs6000/rs6000.md | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14486af0c5a..b45b91ddfdb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-11-03 Michael Meissner + + 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 Alexandre Oliva Jason Merrill diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 4b83abdf753..2d0dd62a3cf 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -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. */ diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index bc8e52d6f6a..43270f82fb4 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -376,7 +376,7 @@ (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")]) @@ -398,7 +398,7 @@ (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)")