===================================================================
@@ -30,13 +30,20 @@
/* 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). */
+ 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. */
+#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)));
+#else
+typedef __complex float TCtype __attribute__ ((mode (TC)));
+#endif
+
/* Force the use of the VSX instruction set. */
#if defined(_ARCH_PPC) && (!defined(__VSX__) || !defined(__FLOAT128__))
#pragma GCC target ("vsx,float128")
@@ -88,6 +95,8 @@ extern TFtype __floatunsikf_sw (USItype_
extern TFtype __floatundikf_sw (UDItype_ppc);
extern IBM128_TYPE __extendkftf2_sw (TFtype);
extern TFtype __trunctfkf2_sw (IBM128_TYPE);
+extern TCtype __mulkc3_sw (TFtype, TFtype, TFtype, TFtype);
+extern TCtype __divkc3_sw (TFtype, TFtype, TFtype, TFtype);
#ifdef _ARCH_PPC64
/* We do not provide ifunc resolvers for __fixkfti, __fixunskfti, __floattikf,
@@ -128,6 +137,8 @@ extern TFtype __floatunsikf_hw (USItype_
extern TFtype __floatundikf_hw (UDItype_ppc);
extern IBM128_TYPE __extendkftf2_hw (TFtype);
extern TFtype __trunctfkf2_hw (IBM128_TYPE);
+extern TCtype __mulkc3_hw (TFtype, TFtype, TFtype, TFtype);
+extern TCtype __divkc3_hw (TFtype, TFtype, TFtype, TFtype);
/* Ifunc function declarations, to automatically switch between software
emulation and hardware support. */
===================================================================
@@ -31,6 +31,10 @@ typedef __complex float KCtype __attribu
#define isnan __builtin_isnan
#define isinf __builtin_isinf
+#if defined(FLOAT128_HW_INSNS) && !defined(__mulkc3)
+#define __mulkc3 __mulkc3_sw
+#endif
+
KCtype
__mulkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
{
===================================================================
@@ -33,6 +33,10 @@ typedef __complex float KCtype __attribu
#define isinf __builtin_isinf
#define isfinite __builtin_isfinite
+#if defined(FLOAT128_HW_INSNS) && !defined(__divkc3)
+#define __divkc3 __divkc3_sw
+#endif
+
KCtype
__divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
{
===================================================================
@@ -71,6 +71,8 @@ typedef TFtype (f128_func_usi_t)(USItype
typedef TFtype (f128_func_udi_t)(UDItype_ppc);
typedef IBM128_TYPE (ibm_func_f128_t)(TFtype);
typedef TFtype (f128_func_ibm_t)(IBM128_TYPE);
+typedef TCtype (cf128_func_f128_f128_f128_f128_t) (TFtype, TFtype, TFtype,
+ TFtype);
static f128_func_f128_f128_t *__addkf3_resolve (void);
static f128_func_f128_f128_t *__subkf3_resolve (void);
@@ -98,6 +100,8 @@ static f128_func_usi_t *__floatunsikf_re
static f128_func_udi_t *__floatundikf_resolve (void);
static ibm_func_f128_t *__extendkftf2_resolve (void);
static f128_func_ibm_t *__trunctfkf2_resolve (void);
+static cf128_func_f128_f128_f128_f128_t *__mulkc3_resolve (void);
+static cf128_func_f128_f128_f128_f128_t *__divkc3_resolve (void);
static f128_func_f128_f128_t *
__addkf3_resolve (void)
@@ -210,7 +214,19 @@ __extendkftf2_resolve (void)
static f128_func_ibm_t *
__trunctfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw);
+ return SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw);
+}
+
+static cf128_func_f128_f128_f128_f128_t *
+__mulkc3_resolve (void)
+{
+ return SW_OR_HW (__mulkc3_sw, __mulkc3_hw);
+}
+
+static cf128_func_f128_f128_f128_f128_t *
+__divkc3_resolve (void)
+{
+ return SW_OR_HW (__divkc3_sw, __divkc3_hw);
}
static cmp_func_f128_f128_t *
@@ -338,3 +354,9 @@ IBM128_TYPE __extendkftf2 (TFtype)
TFtype __trunctfkf2 (IBM128_TYPE)
__attribute__ ((__ifunc__ ("__trunctfkf2_resolve")));
+
+TCtype __mulkc3 (TFtype, TFtype, TFtype, TFtype)
+ __attribute__ ((__ifunc__ ("__mulkc3_resolve")));
+
+TCtype __divkc3 (TFtype, TFtype, TFtype, TFtype)
+ __attribute__ ((__ifunc__ ("__divkc3_resolve")));
===================================================================
@@ -5,10 +5,12 @@
FLOAT128_HW_INSNS = -DFLOAT128_HW_INSNS
# New functions for hardware support
-fp128_hw_funcs = float128-hw
-fp128_hw_src = $(srcdir)/config/rs6000/float128-hw.c
-fp128_hw_static_obj = float128-hw$(objext)
-fp128_hw_shared_obj = float128-hw_s$(objext)
+fp128_hardfp_src = _mulkc3-hw.c _divkc3-hw.c
+fp128_hw_funcs = float128-hw _mulkc3-hw _divkc3-hw
+fp128_hw_src = $(srcdir)/config/rs6000/float128-hw.c _mulkc3-hw.c \
+ _divkc3-hw.c
+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
@@ -33,3 +35,13 @@ $(fp128_hw_obj) : $(srcdir)/config/rs6
$(fp128_ifunc_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW)
$(fp128_ifunc_obj) : $(srcdir)/config/rs6000/t-float128-hw
+
+_mulkc3-hw.c: $(srcdir)/config/rs6000/_mulkc3.c
+ rm -rf _mulkc3.c
+ (echo "#define __mulkc3 __mulkc3_hw"; \
+ cat $(srcdir)/config/rs6000/_mulkc3.c) > _mulkc3-hw.c
+
+_divkc3-hw.c: $(srcdir)/config/rs6000/_divkc3.c
+ rm -rf _divkc3.c
+ (echo "#define __divkc3 __divkc3_hw"; \
+ cat $(srcdir)/config/rs6000/_divkc3.c) > _divkc3-hw.c
===================================================================
@@ -86,7 +86,7 @@ test:
for x in $(fp128_obj); do echo " $$x"; done;
clean-float128:
- rm -rf $(fp128_softfp_src)
+ rm -rf $(fp128_softfp_src) $(fp128_hardfp_src)
@$(MULTICLEAN) multi-clean DO=clean-float128
# For now, only put it in the static library