public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/meissner/heads/work106)] PR target/107299: Update IEEE 128-bit types in PowerPC libgcc.
@ 2023-01-18  6:11 Michael Meissner
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Meissner @ 2023-01-18  6:11 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:c69c092e3eed38677a7f26150097d86670ce0c42

commit c69c092e3eed38677a7f26150097d86670ce0c42
Author: Michael Meissner <meissner@linux.ibm.com>
Date:   Wed Jan 18 01:10:55 2023 -0500

    PR target/107299: Update IEEE 128-bit types in PowerPC libgcc.
    
    This patch updates the IEEE 128-bit types in libgcc.
    
    At the moment, we cannot build GCC when the target uses IEEE 128-bit long
    doubles, such as building the compiler for a native Fedora 36 system.  The
    build dies when it is trying to build the _mulkc3.c and _divkc3 modules.
    
    This patch changes the IEEE 128-bit type (TFtype) in the IEEE 128-bit support
    to use either _Float128 or long double.  Previously we would use the __float128
    type.  In addition, the TCtype will use the same type along with _Complex.
    
    While it is desirable to ultimately have __float128 and _Float128 use the same
    internal type and mode within GCC, at present if you use the option
    -mabi=ieeelongdouble, the __float128 type will use the long double type.  We
    get an internal compiler error if we combine the signbitf128 built-in with a
    long double type.
    
    I've gone through several iterations of trying to fix this within GCC, and
    there are various problems that have come up.  I developed this alternative
    patch that changes libgcc so that it does not tickle the issue.  I hope we can
    fix the compiler at some point, but right now, this is preventing people on
    Fedora 36 systems from building compilers where the default long double is IEEE
    128-bit.
    
    I changed the three functions that deal with complex multiply and complex divide
    support (_mulkc3, _divkc3, and float128-ifunc) to always be compiled with IEEE
    128-bit long double.  This is to be type correct, and avoid mismatch declaration
    errors from the compiler.
    
    2023-01-18   Michael Meissner  <meissner@linux.ibm.com>
    
            PR target/107299
            * config/rs6000/_divkc3.c (top level): Require that long double is IEEE
            128-bit.
            (COPYSIGN): Use long double built-in.
            (INFINITY): Likewise.
            (FABS): Likewise.
            (RBIG): Use TFmode constants, not KFmode.
            (RMIN): Likewise.
            (RMIN2): Likewise.
            (RMINSCAL): Likewise.
            (RMAX2): Likewise.
            * config/rs6000/_mulkc3.c (top level): Require that long double is IEEE
            128-bit.
            (COPYSIGN): Use long double built-in.
            (INFINITY): Likewise.
            * config/rs6000/quad-float128.h (TF): Remove definition.
            (TFtype): New macro, use _Float128 or long double.
            (TCtype): Change to macro, use _Complex _Float128 or _Complex long
            double.
            (__mulkc3_sw): Only declare if long double is IEEE 128-bit.
            (__divkc3_sw): Likewise.
            (__mulkc3_hw): Likewise.
            (__divkc3_hw): Likewise.
            (__mulkc3): Likewise.
            (__divkc3): Likewise.
            * config/rs6000/t-rs6000 (fp128_cmuldiv): Add support to build IEEE
            128-bit complex multiply/divide with explicit IEEE-128 long double.
            (fp128_cmuldiv_static_obj): Likewise.
            (fp128_cmuldiv_shared_obj): Likewise.
            (fp128_cmuldiv_obj): Likewise.
            (fp128_ppc_funcs): Likewise.
            (FP128_CFLAGS_CMULDIV): Likewise.
            * config/rs6000/t-rs6000-hw (fp128_hardfp_src): Delete, unused.
            (fp128_cmuldiv_funcs): Add support to build IEEE 128-bit complex
            multiply/divide with explicit IEEE-128 long double.
            (fp128_cmuldiv_static_obj): Likewise.
            (fp128_cmuldiv_shared_obj): Likewise.
            (fp128_cmuldiv_obj): Likewise.
            (fp128_hw_funcs): Likewise.
            (fp128_ifunc_funcs): Delete, unused.
            (fp128_ifunc_src): Likewise.
            * libgcc2.h (TFtype): Allow md files to override this.
            (TCtype): Likewise.
            * soft-fp/quad.h (TFtype): Likewise.

Diff:
---
 libgcc/config/rs6000/_divkc3.c       | 18 +++++++-----------
 libgcc/config/rs6000/_mulkc3.c       |  8 ++++++--
 libgcc/config/rs6000/quad-float128.h | 25 +++++++++++++------------
 libgcc/config/rs6000/t-float128      | 15 ++++++++++++++-
 libgcc/config/rs6000/t-float128-hw   | 20 ++++++++++++++------
 libgcc/libgcc2.h                     |  4 ++++
 libgcc/soft-fp/quad.h                |  2 ++
 7 files changed, 60 insertions(+), 32 deletions(-)

diff --git a/libgcc/config/rs6000/_divkc3.c b/libgcc/config/rs6000/_divkc3.c
index 59ab2137d1d..cfbc7b76516 100644
--- a/libgcc/config/rs6000/_divkc3.c
+++ b/libgcc/config/rs6000/_divkc3.c
@@ -26,9 +26,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "soft-fp.h"
 #include "quad-float128.h"
 
-#define COPYSIGN(x,y) __builtin_copysignf128 (x, y)
-#define INFINITY __builtin_inff128 ()
-#define FABS __builtin_fabsf128
+#ifndef __LONG_DOUBLE_IEEE128__
+#error "_divkc3.c needs to be compiled with -mabi=ieeelongdouble."
+#endif
+
+#define COPYSIGN(x,y) __builtin_copysignl (x, y)
+#define INFINITY __builtin_infl ()
+#define FABS __builtin_fabsl
 #define isnan __builtin_isnan
 #define isinf __builtin_isinf
 #define isfinite __builtin_isfinite
@@ -37,19 +41,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define __divkc3 __divkc3_sw
 #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 RMAX2  (RBIG * RMIN2)
-#else
 #define RBIG   (__LIBGCC_TF_MAX__ / 2)
 #define RMIN   (__LIBGCC_TF_MIN__)
 #define RMIN2  (__LIBGCC_TF_EPSILON__)
 #define RMINSCAL (1 / __LIBGCC_TF_EPSILON__)
 #define RMAX2  (RBIG * RMIN2)
-#endif
 
 TCtype
 __divkc3 (TFtype a, TFtype b, TFtype c, TFtype d)
diff --git a/libgcc/config/rs6000/_mulkc3.c b/libgcc/config/rs6000/_mulkc3.c
index cfae81f8b5f..345d6300b4c 100644
--- a/libgcc/config/rs6000/_mulkc3.c
+++ b/libgcc/config/rs6000/_mulkc3.c
@@ -26,8 +26,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "soft-fp.h"
 #include "quad-float128.h"
 
-#define COPYSIGN(x,y) __builtin_copysignf128 (x, y)
-#define INFINITY __builtin_inff128 ()
+#ifndef __LONG_DOUBLE_IEEE128__
+#error "_mulkc3.c needs to be compiled with -mabi=ieeelongdouble."
+#endif
+
+#define COPYSIGN(x,y) __builtin_copysignl (x, y)
+#define INFINITY __builtin_infl ()
 #define isnan __builtin_isnan
 #define isinf __builtin_isinf
 
diff --git a/libgcc/config/rs6000/quad-float128.h b/libgcc/config/rs6000/quad-float128.h
index ae0622c744c..35eeccfa952 100644
--- a/libgcc/config/rs6000/quad-float128.h
+++ b/libgcc/config/rs6000/quad-float128.h
@@ -27,21 +27,14 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* quad.h defines the TFtype type by:
-   typedef float TFtype __attribute__ ((mode (TF)));
-
-   This define forces it to use KFmode (aka, ieee 128-bit floating point).
-   However, when the compiler's default is changed so that long double is IEEE
-   128-bit floating point, we need to go back to using TFmode and TCmode.  */
+/* Override quad.h's definitions for 128-bit floating point type.  */
 #ifndef __LONG_DOUBLE_IEEE128__
-#define TF KF
-
-/* We also need TCtype to represent complex ieee 128-bit float for
-   __mulkc3 and __divkc3.  */
-typedef __complex float TCtype __attribute__ ((mode (KC)));
+#define TFtype _Float128		/* long double is IBM.  */
+#define TCtype _Complex _Float128
 
 #else
-typedef __complex float TCtype __attribute__ ((mode (TC)));
+#define TFtype long double		/* long double is IEEE.  */
+#define TCtype _Complex long double
 #endif
 
 /* Force the use of the VSX instruction set.  */
@@ -100,8 +93,11 @@ extern UTItype_ppc __fixunskfti_sw (TFtype);
 #endif
 extern IBM128_TYPE __extendkftf2_sw (TFtype);
 extern TFtype __trunctfkf2_sw (IBM128_TYPE);
+
+#ifdef __LONG_DOUBLE_IEEE128__
 extern TCtype __mulkc3_sw (TFtype, TFtype, TFtype, TFtype);
 extern TCtype __divkc3_sw (TFtype, TFtype, TFtype, TFtype);
+#endif
 
 #ifdef _ARCH_PPC64
 extern TItype_ppc __fixkfti (TFtype);
@@ -146,8 +142,11 @@ extern UTItype_ppc __fixunskfti_hw (TFtype);
 #endif
 extern IBM128_TYPE __extendkftf2_hw (TFtype);
 extern TFtype __trunctfkf2_hw (IBM128_TYPE);
+
+#ifdef __LONG_DOUBLE_IEEE128__
 extern TCtype __mulkc3_hw (TFtype, TFtype, TFtype, TFtype);
 extern TCtype __divkc3_hw (TFtype, TFtype, TFtype, TFtype);
+#endif
 
 /* Ifunc function declarations, to automatically switch between software
    emulation and hardware support.  */
@@ -188,8 +187,10 @@ extern IBM128_TYPE __extendkftf2 (TFtype);
 extern TFtype __trunctfkf2 (IBM128_TYPE);
 
 /* Complex __float128 built on __float128 interfaces.  */
+#ifdef __LONG_DOUBLE_IEEE128__
 extern TCtype __mulkc3 (TFtype, TFtype, TFtype, TFtype);
 extern TCtype __divkc3 (TFtype, TFtype, TFtype, TFtype);
+#endif
 
 /* Convert IEEE 128-bit floating point to/from string.  We explicitly use
    _Float128 instead of TFmode because _strtokf and _strfromkf must be compiled
diff --git a/libgcc/config/rs6000/t-float128 b/libgcc/config/rs6000/t-float128
index b09b5664af0..5b944f985b8 100644
--- a/libgcc/config/rs6000/t-float128
+++ b/libgcc/config/rs6000/t-float128
@@ -30,11 +30,18 @@ fp128_dec_funcs		= _kf_to_sd _kf_to_dd _kf_to_td \
 ibm128_dec_funcs	= _tf_to_sd _tf_to_dd _tf_to_td \
 			  _sd_to_tf _dd_to_tf _td_to_tf
 
+# Complex IEEE 128-bit multiply/divide support.
+fp128_cmuldiv            = _mulkc3 _divkc3
+fp128_cmuldiv_static_obj = $(addsuffix $(objext),$(fp128_cmuldiv))
+fp128_cmuldiv_shared_obj = $(addsuffix _s$(objext),$(fp128_cmuldiv))
+fp128_cmuldiv_obj        = $(fp128_cmuldiv_shared_obj) \
+                           $(fp128_cmuldiv_static_obj)
+
 # New functions for software emulation
 fp128_ppc_funcs		= floattikf-sw floatuntikf-sw \
 			  fixkfti-sw fixunskfti-sw \
 			  extendkftf2-sw trunctfkf2-sw \
-			  sfp-exceptions _mulkc3 _divkc3 _powikf2
+			  sfp-exceptions $(fp128_cmuldiv) _powikf2
 
 ifeq ($(decimal_float),yes)
 fp128_ppc_funcs        += $(fp128_dec_funcs)
@@ -100,6 +107,12 @@ IBM128_CFLAGS_DECIMAL	= -mno-gnu-attribute -Wno-psabi -mabi=ibmlongdouble
 $(fp128_dec_objs)	: INTERNAL_CFLAGS += $(FP128_CFLAGS_DECIMAL)
 $(ibm128_dec_objs)	: INTERNAL_CFLAGS += $(IBM128_CFLAGS_DECIMAL)
 
+# Force IEEE 128-bit complex multiply/divide support to be built with IEEE
+# 128-bit long double.
+FP128_CFLAGS_CMULDIV	= -Wno-psabi -mabi=ieeelongdouble
+
+$(fp128_cmuldiv_objs)	: INTERNAL_CFLAGS += $(FP128_CFLAGS_CMULDIV)
+
 $(fp128_softfp_src) : $(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@)) $(fp128_dep)
 	@src="$(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@))"; \
 	echo "Create $@"; \
diff --git a/libgcc/config/rs6000/t-float128-hw b/libgcc/config/rs6000/t-float128-hw
index d64ca4dd694..d1eeb6cd3f2 100644
--- a/libgcc/config/rs6000/t-float128-hw
+++ b/libgcc/config/rs6000/t-float128-hw
@@ -5,16 +5,17 @@
 FLOAT128_HW_INSNS	= -DFLOAT128_HW_INSNS
 
 # New functions for hardware support
-fp128_hardfp_src	= _mulkc3-hw.c _divkc3-hw.c
-fp128_hw_funcs		= float128-hw _mulkc3-hw _divkc3-hw _powikf2-hw
-fp128_hw_src		= $(srcdir)/config/rs6000/float128-hw.c _mulkc3-hw.c \
-			  _divkc3-hw.c _powikf2-hw.c
+fp128_cmuldiv_funcs	= _mulkc3-hw _divkc3-hw
+fp128_cmuldiv_static_obj = $(addsuffix $(objext),$(fp128_cmuldiv_funcs))
+fp128_cmuldiv_shared_obj = $(addsuffix _s$(objext),$(fp128_cmuldiv_funcs))
+fp128_cmuldiv_obj	= $(fp128_cmuldiv_static_obj) \
+			  $(fp128_cmuldiv_shared_obj)
+
+fp128_hw_funcs		= float128-hw $(fp128_cmuldiv_funcs) _powikf2-hw
 fp128_hw_static_obj	= $(addsuffix $(objext),$(fp128_hw_funcs))
 fp128_hw_shared_obj	= $(addsuffix _s$(objext),$(fp128_hw_funcs))
 fp128_hw_obj		= $(fp128_hw_static_obj) $(fp128_hw_shared_obj)
 
-fp128_ifunc_funcs	= float128-ifunc
-fp128_ifunc_src		= $(srcdir)/config/rs6000/float128-ifunc.c
 fp128_ifunc_static_obj	= float128-ifunc$(objext)
 fp128_ifunc_shared_obj	= float128-ifunc_s$(objext)
 fp128_ifunc_obj		= $(fp128_ifunc_static_obj) $(fp128_ifunc_shared_obj)
@@ -36,6 +37,13 @@ $(fp128_hw_obj)		 : $(srcdir)/config/rs6000/t-float128-hw
 $(fp128_ifunc_obj)	 : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW)
 $(fp128_ifunc_obj)	 : $(srcdir)/config/rs6000/t-float128-hw
 
+# Build IEEE 128-bit complex multiply/divide support with explicit IEEE 128-bit
+# long double.  Also build the float128-ifunc module with explicit IEEE 128-bit
+# support, because it has to support software/hardware variants of complex
+# mulitply/divide.
+$(fp128_cmuldiv_obj)	: INTERNAL_CFLAGS += $(FP128_CFLAGS_CMULDIV)
+$(fp128_ifunc_obj)	: INTERNAL_CFLAGS += $(FP128_CFLAGS_CMULDIV)
+
 _mulkc3-hw.c: $(srcdir)/config/rs6000/_mulkc3.c
 	(echo "#define __mulkc3 __mulkc3_hw"; \
 	 cat $(srcdir)/config/rs6000/_mulkc3.c) > _mulkc3-hw.c
diff --git a/libgcc/libgcc2.h b/libgcc/libgcc2.h
index fc24ac34502..6a249877c7a 100644
--- a/libgcc/libgcc2.h
+++ b/libgcc/libgcc2.h
@@ -156,9 +156,13 @@ typedef		float XFtype	__attribute__ ((mode (XF)));
 typedef _Complex float XCtype	__attribute__ ((mode (XC)));
 #endif
 #if LIBGCC2_HAS_TF_MODE
+#ifndef TFtype
 typedef		float TFtype	__attribute__ ((mode (TF)));
+#endif
+#ifndef TCtype
 typedef _Complex float TCtype	__attribute__ ((mode (TC)));
 #endif
+#endif
 
 typedef int cmp_return_type __attribute__((mode (__libgcc_cmp_return__)));
 typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__)));
diff --git a/libgcc/soft-fp/quad.h b/libgcc/soft-fp/quad.h
index 3889bb44f1f..71f87d36ba9 100644
--- a/libgcc/soft-fp/quad.h
+++ b/libgcc/soft-fp/quad.h
@@ -65,7 +65,9 @@
 #define _FP_HIGHBIT_DW_Q	\
   ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_Q - 1) % _FP_W_TYPE_SIZE)
 
+#ifndef TFtype
 typedef float TFtype __attribute__ ((mode (TF)));
+#endif
 
 #if _FP_W_TYPE_SIZE < 64

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [gcc(refs/users/meissner/heads/work106)] PR target/107299: Update IEEE 128-bit types in PowerPC libgcc.
@ 2023-01-18  2:37 Michael Meissner
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Meissner @ 2023-01-18  2:37 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:30aa0f24db80e34d3c345e35f0f879a7fcc2a168

commit 30aa0f24db80e34d3c345e35f0f879a7fcc2a168
Author: Michael Meissner <meissner@linux.ibm.com>
Date:   Tue Jan 17 21:37:15 2023 -0500

    PR target/107299: Update IEEE 128-bit types in PowerPC libgcc.
    
    This patch updates the IEEE 128-bit types in libgcc.
    
    At the moment, we cannot build GCC when the target uses IEEE 128-bit long
    doubles, such as building the compiler for a native Fedora 36 system.  The
    build dies when it is trying to build the _mulkc3.c and _divkc3 modules.
    
    This patch changes the IEEE 128-bit type (TFtype) in the IEEE 128-bit support
    to use either _Float128 or long double.  Previously we would use the __float128
    type.  In addition, the TCtype will use the same type along with _Complex.
    
    While it is desirable to ultimately have __float128 and _Float128 use the same
    internal type and mode within GCC, at present if you use the option
    -mabi=ieeelongdouble, the __float128 type will use the long double type.  We
    get an internal compiler error if we combine the signbitf128 built-in with a
    long double type.
    
    I've gone through several iterations of trying to fix this within GCC, and
    there are various problems that have come up.  I developed this alternative
    patch that changes libgcc so that it does not tickle the issue.  I hope we can
    fix the compiler at some point, but right now, this is preventing people on
    Fedora 36 systems from building compilers where the default long double is IEEE
    128-bit.
    
    I changed the three functions that deal with complex multiply and complex divide
    support (_mulkc3, _divkc3, and float128-ifunc) to always be compiled with IEEE
    128-bit long double.  This is to be type correct, and avoid mismatch declaration
    errors from the compiler.
    
    2023-01-17   Michael Meissner  <meissner@linux.ibm.com>
    
            PR target/107299
            * config/rs6000/_divkc3.c (top level): Require that long double is IEEE
            128-bit.
            (COPYSIGN): Use long double built-in.
            (INFINITY): Likewise.
            (FABS): Likewise.
            (RBIG): Use TFmode constants, not KFmode.
            (RMIN): Likewise.
            (RMIN2): Likewise.
            (RMINSCAL): Likewise.
            (RMAX2): Likewise.
            * config/rs6000/_mulkc3.c (top level): Require that long double is IEEE
            128-bit.
            (COPYSIGN): Use long double built-in.
            (INFINITY): Likewise.
            * config/rs6000/quad-float128.h (TF): Remove definition.
            (TFtype): New macro, use _Float128 or long double.
            (TCtype): Change to macro, use _Complex _Float128 or _Complex long
            double.
            (__mulkc3_sw): Only declare if long double is IEEE 128-bit.
            (__divkc3_sw): Likewise.
            (__mulkc3_hw): Likewise.
            (__divkc3_hw): Likewise.
            (__mulkc3): Likewise.
            (__divkc3): Likewise.
            * libgcc2.h (TFtype): Allow md files to override this.
            (TCtype): Likewise.
            * soft-fp/quad.h (TFtype): Likewise.

Diff:
---
 libgcc/config/rs6000/_divkc3.c       | 18 +++++++-----------
 libgcc/config/rs6000/_mulkc3.c       |  8 ++++++--
 libgcc/config/rs6000/quad-float128.h | 25 +++++++++++++------------
 libgcc/libgcc2.h                     |  4 ++++
 libgcc/soft-fp/quad.h                |  2 ++
 5 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/libgcc/config/rs6000/_divkc3.c b/libgcc/config/rs6000/_divkc3.c
index 59ab2137d1d..cfbc7b76516 100644
--- a/libgcc/config/rs6000/_divkc3.c
+++ b/libgcc/config/rs6000/_divkc3.c
@@ -26,9 +26,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "soft-fp.h"
 #include "quad-float128.h"
 
-#define COPYSIGN(x,y) __builtin_copysignf128 (x, y)
-#define INFINITY __builtin_inff128 ()
-#define FABS __builtin_fabsf128
+#ifndef __LONG_DOUBLE_IEEE128__
+#error "_divkc3.c needs to be compiled with -mabi=ieeelongdouble."
+#endif
+
+#define COPYSIGN(x,y) __builtin_copysignl (x, y)
+#define INFINITY __builtin_infl ()
+#define FABS __builtin_fabsl
 #define isnan __builtin_isnan
 #define isinf __builtin_isinf
 #define isfinite __builtin_isfinite
@@ -37,19 +41,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define __divkc3 __divkc3_sw
 #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 RMAX2  (RBIG * RMIN2)
-#else
 #define RBIG   (__LIBGCC_TF_MAX__ / 2)
 #define RMIN   (__LIBGCC_TF_MIN__)
 #define RMIN2  (__LIBGCC_TF_EPSILON__)
 #define RMINSCAL (1 / __LIBGCC_TF_EPSILON__)
 #define RMAX2  (RBIG * RMIN2)
-#endif
 
 TCtype
 __divkc3 (TFtype a, TFtype b, TFtype c, TFtype d)
diff --git a/libgcc/config/rs6000/_mulkc3.c b/libgcc/config/rs6000/_mulkc3.c
index cfae81f8b5f..345d6300b4c 100644
--- a/libgcc/config/rs6000/_mulkc3.c
+++ b/libgcc/config/rs6000/_mulkc3.c
@@ -26,8 +26,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "soft-fp.h"
 #include "quad-float128.h"
 
-#define COPYSIGN(x,y) __builtin_copysignf128 (x, y)
-#define INFINITY __builtin_inff128 ()
+#ifndef __LONG_DOUBLE_IEEE128__
+#error "_mulkc3.c needs to be compiled with -mabi=ieeelongdouble."
+#endif
+
+#define COPYSIGN(x,y) __builtin_copysignl (x, y)
+#define INFINITY __builtin_infl ()
 #define isnan __builtin_isnan
 #define isinf __builtin_isinf
 
diff --git a/libgcc/config/rs6000/quad-float128.h b/libgcc/config/rs6000/quad-float128.h
index ae0622c744c..35eeccfa952 100644
--- a/libgcc/config/rs6000/quad-float128.h
+++ b/libgcc/config/rs6000/quad-float128.h
@@ -27,21 +27,14 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* quad.h defines the TFtype type by:
-   typedef float TFtype __attribute__ ((mode (TF)));
-
-   This define forces it to use KFmode (aka, ieee 128-bit floating point).
-   However, when the compiler's default is changed so that long double is IEEE
-   128-bit floating point, we need to go back to using TFmode and TCmode.  */
+/* Override quad.h's definitions for 128-bit floating point type.  */
 #ifndef __LONG_DOUBLE_IEEE128__
-#define TF KF
-
-/* We also need TCtype to represent complex ieee 128-bit float for
-   __mulkc3 and __divkc3.  */
-typedef __complex float TCtype __attribute__ ((mode (KC)));
+#define TFtype _Float128		/* long double is IBM.  */
+#define TCtype _Complex _Float128
 
 #else
-typedef __complex float TCtype __attribute__ ((mode (TC)));
+#define TFtype long double		/* long double is IEEE.  */
+#define TCtype _Complex long double
 #endif
 
 /* Force the use of the VSX instruction set.  */
@@ -100,8 +93,11 @@ extern UTItype_ppc __fixunskfti_sw (TFtype);
 #endif
 extern IBM128_TYPE __extendkftf2_sw (TFtype);
 extern TFtype __trunctfkf2_sw (IBM128_TYPE);
+
+#ifdef __LONG_DOUBLE_IEEE128__
 extern TCtype __mulkc3_sw (TFtype, TFtype, TFtype, TFtype);
 extern TCtype __divkc3_sw (TFtype, TFtype, TFtype, TFtype);
+#endif
 
 #ifdef _ARCH_PPC64
 extern TItype_ppc __fixkfti (TFtype);
@@ -146,8 +142,11 @@ extern UTItype_ppc __fixunskfti_hw (TFtype);
 #endif
 extern IBM128_TYPE __extendkftf2_hw (TFtype);
 extern TFtype __trunctfkf2_hw (IBM128_TYPE);
+
+#ifdef __LONG_DOUBLE_IEEE128__
 extern TCtype __mulkc3_hw (TFtype, TFtype, TFtype, TFtype);
 extern TCtype __divkc3_hw (TFtype, TFtype, TFtype, TFtype);
+#endif
 
 /* Ifunc function declarations, to automatically switch between software
    emulation and hardware support.  */
@@ -188,8 +187,10 @@ extern IBM128_TYPE __extendkftf2 (TFtype);
 extern TFtype __trunctfkf2 (IBM128_TYPE);
 
 /* Complex __float128 built on __float128 interfaces.  */
+#ifdef __LONG_DOUBLE_IEEE128__
 extern TCtype __mulkc3 (TFtype, TFtype, TFtype, TFtype);
 extern TCtype __divkc3 (TFtype, TFtype, TFtype, TFtype);
+#endif
 
 /* Convert IEEE 128-bit floating point to/from string.  We explicitly use
    _Float128 instead of TFmode because _strtokf and _strfromkf must be compiled
diff --git a/libgcc/libgcc2.h b/libgcc/libgcc2.h
index fc24ac34502..6a249877c7a 100644
--- a/libgcc/libgcc2.h
+++ b/libgcc/libgcc2.h
@@ -156,9 +156,13 @@ typedef		float XFtype	__attribute__ ((mode (XF)));
 typedef _Complex float XCtype	__attribute__ ((mode (XC)));
 #endif
 #if LIBGCC2_HAS_TF_MODE
+#ifndef TFtype
 typedef		float TFtype	__attribute__ ((mode (TF)));
+#endif
+#ifndef TCtype
 typedef _Complex float TCtype	__attribute__ ((mode (TC)));
 #endif
+#endif
 
 typedef int cmp_return_type __attribute__((mode (__libgcc_cmp_return__)));
 typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__)));
diff --git a/libgcc/soft-fp/quad.h b/libgcc/soft-fp/quad.h
index 3889bb44f1f..71f87d36ba9 100644
--- a/libgcc/soft-fp/quad.h
+++ b/libgcc/soft-fp/quad.h
@@ -65,7 +65,9 @@
 #define _FP_HIGHBIT_DW_Q	\
   ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_Q - 1) % _FP_W_TYPE_SIZE)
 
+#ifndef TFtype
 typedef float TFtype __attribute__ ((mode (TF)));
+#endif
 
 #if _FP_W_TYPE_SIZE < 64

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-01-18  6:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-18  6:11 [gcc(refs/users/meissner/heads/work106)] PR target/107299: Update IEEE 128-bit types in PowerPC libgcc Michael Meissner
  -- strict thread matches above, loose matches on Subject: below --
2023-01-18  2:37 Michael Meissner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).