Hi! On Thu, Jul 08, 2021 at 09:24:31PM +0000, Patrick McGehearty via Gcc-patches wrote: > This patch resolves the failure of powerpc64 long double complex divide > in native ibm long double format after the patch "Practical improvement > to libgcc complex divide". > See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101104
> The MAX and MIN values have only modest changes since the exponent > field for IBM 128-bit floating point values is the same size as > the exponent field for IBM 64-bit floating point values. Finite double-double values have two exponent fields, one for each DP half that together make up the number. You are referring to the first one here. > However > the EPSILON field is considerably different. Due to how small > values can be represented in the lower 64 bits of the IBM 128-bit > floating point, EPSILON is extremely small, so far beyond the > desired value that inversion of the value overflows and even > without the overflow, the RMAX2 is so small as to eliminate > most usage of the test. The representable values of double-double and those of IEEE QP float are not a subset of each other in either direction. Since a number in double-double is essentially the sum of two DP float numbers, two such sums numbers can be very close together, compared to the magnitude of them (the epsilon is equal to the minimum non-zero value). > In addition, the gcc support for the KF fields (IBM native long double > format) KFmode is IEEE QP float, always. IFmode is IBM extended double, always. TFmode can be either. > does not exist on older gcc compilers such as the default > compilers on the gcc compiler farm. That adds build complexity > for users who's environment is only a few years out of date. CentOS 7 is from 2014. It's about the oldest we support at all. > libgcc/ You should say PR target/101104 > * config/rs6000/_divkc3.c (RBIG, RMIN, RMIN2, RMINSCAL, RMAX2): > Fix long double complex divide for native IBM 128-bit End sentences (like lines in a changelog) with a full stop, too. > --- a/libgcc/config/rs6000/_divkc3.c > +++ b/libgcc/config/rs6000/_divkc3.c > @@ -38,10 +38,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. > If not, see > #endif > > #ifndef __LONG_DOUBLE_IEEE128__ > -#define RBIG (__LIBGCC_KF_MAX__ / 2) > -#define RMIN (__LIBGCC_KF_MIN__) > -#define RMIN2 (__LIBGCC_KF_EPSILON__) > -#define RMINSCAL (1 / __LIBGCC_KF_EPSILON__) > +#define RBIG (__LIBGCC_DF_MAX__ / 2) > +#define RMIN (__LIBGCC_DF_MIN__) > +#define RMIN2 (__LIBGCC_DF_EPSILON__) > +#define RMINSCAL (1 / __LIBGCC_DF_EPSILON__) > #define RMAX2 (RBIG * RMIN2) > #else > #define RBIG (__LIBGCC_TF_MAX__ / 2) What *is* your long double? It should always be IEEE QP float in this file! And it is for me. So what did you do differently? Segher