* [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
@ 2017-11-27 19:57 Michael Meissner
2017-11-27 22:55 ` Martin Sebor
0 siblings, 1 reply; 12+ messages in thread
From: Michael Meissner @ 2017-11-27 19:57 UTC (permalink / raw)
To: GCC Patches, Segher Boessenkool, David Edelsohn, Bill Schmidt
[-- Attachment #1: Type: text/plain, Size: 1868 bytes --]
The new -Wattribute-alias option now issues warnings for old-style ifunc
declarations that coerce the pointer to the function to void *. The
float128-ifunc.c module in libgcc/config/rs6000 now gets a lot of warnings of
the form:
../float128-ifunc.c:109:1: warning: âifuncâ resolver for â__negkf2â should
return âTFtype (*)(TFtype) {aka _Float128 (*)(_Float128)}â [-Wattribute-alias]
This patch fixes these warnings. I have done a full bootstrap build and test
suite run. I have verified that the ifunc handler works correctly, using
software emulation on a power8 and the hardware instructions on power9. Can I
check this into the trunk?
2017-11-27 Michael Meissner <meissner@linux.vnet.ibm.com>
PR libgcc/83112
* config/rs6000/float128-ifunc.c (__addkf3_resolve): Use the
correct type for all ifunc resolvers to silence -Wattribute-alias
warnings.
(__subkf3_resolve): Likewise.
(__mulkf3_resolve): Likewise.
(__divkf3_resolve): Likewise.
(__negkf2_resolve): Likewise.
(__eqkf2_resolve): Likewise.
(__nekf2_resolve): Likewise.
(__gekf2_resolve): Likewise.
(__gtkf2_resolve): Likewise.
(__lekf2_resolve): Likewise.
(__ltkf2_resolve): Likewise.
(__unordkf2_resolve): Likewise.
(__extendsfkf2_resolve): Likewise.
(__extenddfkf2_resolve): Likewise.
(__trunckfsf2_resolve): Likewise.
(__trunckfdf2_resolve): Likewise.
(__fixkfsi_resolve): Likewise.
(__fixkfdi_resolve): Likewise.
(__fixunskfsi_resolve): Likewise.
(__fixunskfdi_resolve): Likewise.
(__floatsikf_resolve): Likewise.
(__floatdikf_resolve): Likewise.
(__floatunsikf_resolve): Likewise.
(__floatundikf_resolve): Likewise.
(__extendkftf2_resolve): Likewise.
(__trunctfkf2_resolve): Likewise.
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797
[-- Attachment #2: pr83112.patch01b --]
[-- Type: text/plain, Size: 8616 bytes --]
Index: libgcc/config/rs6000/float128-ifunc.c
===================================================================
--- libgcc/config/rs6000/float128-ifunc.c (revision 255033)
+++ libgcc/config/rs6000/float128-ifunc.c (working copy)
@@ -54,190 +54,208 @@
128-bit integer types and 128-bit IEEE floating point, or vice versa. So
use the emulator functions for these conversions. */
-static void *__addkf3_resolve (void);
-static void *__subkf3_resolve (void);
-static void *__mulkf3_resolve (void);
-static void *__divkf3_resolve (void);
-static void *__negkf2_resolve (void);
-static void *__eqkf2_resolve (void);
-static void *__nekf2_resolve (void);
-static void *__gekf2_resolve (void);
-static void *__gtkf2_resolve (void);
-static void *__lekf2_resolve (void);
-static void *__ltkf2_resolve (void);
-static void *__unordkf2_resolve (void);
-static void *__extendsfkf2_resolve (void);
-static void *__extenddfkf2_resolve (void);
-static void *__trunckfsf2_resolve (void);
-static void *__trunckfdf2_resolve (void);
-static void *__fixkfsi_resolve (void);
-static void *__fixkfdi_resolve (void);
-static void *__fixunskfsi_resolve (void);
-static void *__fixunskfdi_resolve (void);
-static void *__floatsikf_resolve (void);
-static void *__floatdikf_resolve (void);
-static void *__floatunsikf_resolve (void);
-static void *__floatundikf_resolve (void);
-static void *__extendkftf2_resolve (void);
-static void *__trunctfkf2_resolve (void);
+typedef TFtype (f128_func_f128_t)(TFtype);
+typedef TFtype (f128_func_f128_f128_t)(TFtype, TFtype);
+typedef CMPtype (cmp_func_f128_f128_t)(TFtype, TFtype);
+typedef TFtype (f128_func_float_t)(float);
+typedef TFtype (f128_func_double_t)(double);
+typedef float (float_func_f128_t)(TFtype);
+typedef double (double_func_f128_t)(TFtype);
+typedef SItype_ppc (si_func_f128_t)(TFtype);
+typedef DItype_ppc (di_func_f128_t)(TFtype);
+typedef USItype_ppc (usi_func_f128_t)(TFtype);
+typedef UDItype_ppc (udi_func_f128_t)(TFtype);
+typedef TFtype (f128_func_si_t)(SItype_ppc);
+typedef TFtype (f128_func_di_t)(DItype_ppc);
+typedef TFtype (f128_func_usi_t)(USItype_ppc);
+typedef TFtype (f128_func_udi_t)(UDItype_ppc);
+typedef IBM128_TYPE (ibm_func_f128_t)(TFtype);
+typedef TFtype (f128_func_ibm_t)(IBM128_TYPE);
+
+static f128_func_f128_f128_t *__addkf3_resolve (void);
+static f128_func_f128_f128_t *__subkf3_resolve (void);
+static f128_func_f128_f128_t *__mulkf3_resolve (void);
+static f128_func_f128_f128_t *__divkf3_resolve (void);
+static f128_func_f128_t *__negkf2_resolve (void);
+static cmp_func_f128_f128_t *__eqkf2_resolve (void);
+static cmp_func_f128_f128_t *__nekf2_resolve (void);
+static cmp_func_f128_f128_t *__gekf2_resolve (void);
+static cmp_func_f128_f128_t *__gtkf2_resolve (void);
+static cmp_func_f128_f128_t *__lekf2_resolve (void);
+static cmp_func_f128_f128_t *__ltkf2_resolve (void);
+static cmp_func_f128_f128_t *__unordkf2_resolve (void);
+static f128_func_float_t *__extendsfkf2_resolve (void);
+static f128_func_double_t *__extenddfkf2_resolve (void);
+static float_func_f128_t *__trunckfsf2_resolve (void);
+static double_func_f128_t *__trunckfdf2_resolve (void);
+static si_func_f128_t *__fixkfsi_resolve (void);
+static di_func_f128_t *__fixkfdi_resolve (void);
+static usi_func_f128_t *__fixunskfsi_resolve (void);
+static udi_func_f128_t *__fixunskfdi_resolve (void);
+static f128_func_si_t *__floatsikf_resolve (void);
+static f128_func_di_t *__floatdikf_resolve (void);
+static f128_func_usi_t *__floatunsikf_resolve (void);
+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 void *
+static f128_func_f128_f128_t *
__addkf3_resolve (void)
{
- return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw);
+ return SW_OR_HW (__addkf3_sw, __addkf3_hw);
}
-static void *
+static f128_func_f128_f128_t *
__subkf3_resolve (void)
{
- return (void *) SW_OR_HW (__subkf3_sw, __subkf3_hw);
+ return SW_OR_HW (__subkf3_sw, __subkf3_hw);
}
-static void *
+static f128_func_f128_f128_t *
__mulkf3_resolve (void)
{
- return (void *) SW_OR_HW (__mulkf3_sw, __mulkf3_hw);
+ return SW_OR_HW (__mulkf3_sw, __mulkf3_hw);
}
-static void *
+static f128_func_f128_f128_t *
__divkf3_resolve (void)
{
- return (void *) SW_OR_HW (__divkf3_sw, __divkf3_hw);
+ return SW_OR_HW (__divkf3_sw, __divkf3_hw);
}
-static void *
+static f128_func_f128_t *
__negkf2_resolve (void)
{
- return (void *) SW_OR_HW (__negkf2_sw, __negkf2_hw);
+ return SW_OR_HW (__negkf2_sw, __negkf2_hw);
}
-static void *
+static f128_func_si_t *
__floatsikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatsikf_sw, __floatsikf_hw);
+ return SW_OR_HW (__floatsikf_sw, __floatsikf_hw);
}
-static void *
+static f128_func_di_t *
__floatdikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatdikf_sw, __floatdikf_hw);
+ return SW_OR_HW (__floatdikf_sw, __floatdikf_hw);
}
-static void *
+static f128_func_usi_t *
__floatunsikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw);
+ return SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw);
}
-static void *
+static f128_func_udi_t *
__floatundikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatundikf_sw, __floatundikf_hw);
+ return SW_OR_HW (__floatundikf_sw, __floatundikf_hw);
}
-static void *
+static si_func_f128_t *
__fixkfsi_resolve (void)
{
- return (void *) SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw);
+ return SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw);
}
-static void *
+static di_func_f128_t *
__fixkfdi_resolve (void)
{
- return (void *) SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw);
+ return SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw);
}
-static void *
+static usi_func_f128_t *
__fixunskfsi_resolve (void)
{
- return (void *) SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw);
+ return SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw);
}
-static void *
+static udi_func_f128_t *
__fixunskfdi_resolve (void)
{
- return (void *) SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw);
+ return SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw);
}
-static void *
+static f128_func_float_t *
__extendsfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw);
+ return SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw);
}
-static void *
+static f128_func_double_t *
__extenddfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw);
+ return SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw);
}
-static void *
+static float_func_f128_t *
__trunckfsf2_resolve (void)
{
- return (void *) SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw);
+ return SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw);
}
-static void *
+static double_func_f128_t *
__trunckfdf2_resolve (void)
{
return (void *) SW_OR_HW (__trunckfdf2_sw, __trunckfdf2_hw);
}
-static void *
+static ibm_func_f128_t *
__extendkftf2_resolve (void)
{
- return (void *) SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw);
+ return SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw);
}
-static void *
+static f128_func_ibm_t *
__trunctfkf2_resolve (void)
{
return (void *) SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw);
}
-static void *
+static cmp_func_f128_f128_t *
__eqkf2_resolve (void)
{
- return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
+ return SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
}
-static void *
+static cmp_func_f128_f128_t *
__gekf2_resolve (void)
{
- return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw);
+ return SW_OR_HW (__gekf2_sw, __gekf2_hw);
}
-static void *
+static cmp_func_f128_f128_t *
__lekf2_resolve (void)
{
- return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw);
+ return SW_OR_HW (__lekf2_sw, __lekf2_hw);
}
-static void *
+static cmp_func_f128_f128_t *
__unordkf2_resolve (void)
{
- return (void *) SW_OR_HW (__unordkf2_sw, __unordkf2_hw);
+ return SW_OR_HW (__unordkf2_sw, __unordkf2_hw);
}
/* Resolve __nekf2, __gtkf2, __ltkf2 like __eqkf2, __gekf2, and __lekf2, since
the functions return the same values. */
-static void *
+static cmp_func_f128_f128_t *
__nekf2_resolve (void)
{
- return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
+ return SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
}
-static void *
+static cmp_func_f128_f128_t *
__gtkf2_resolve (void)
{
- return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw);
+ return SW_OR_HW (__gekf2_sw, __gekf2_hw);
}
-static void *
+static cmp_func_f128_f128_t *
__ltkf2_resolve (void)
{
- return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw);
+ return SW_OR_HW (__lekf2_sw, __lekf2_hw);
}
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-11-27 19:57 [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c Michael Meissner
@ 2017-11-27 22:55 ` Martin Sebor
2017-11-28 0:55 ` Michael Meissner
0 siblings, 1 reply; 12+ messages in thread
From: Martin Sebor @ 2017-11-27 22:55 UTC (permalink / raw)
To: Michael Meissner, GCC Patches, Segher Boessenkool,
David Edelsohn, Bill Schmidt
On 11/27/2017 12:21 PM, Michael Meissner wrote:
> The new -Wattribute-alias option now issues warnings for old-style ifunc
> declarations that coerce the pointer to the function to void *. The
> float128-ifunc.c module in libgcc/config/rs6000 now gets a lot of warnings of
> the form:
>
> ../float128-ifunc.c:109:1: warning: ‘ifunc’ resolver for ‘__negkf2’ should
> return ‘TFtype (*)(TFtype) {aka _Float128 (*)(_Float128)}’ [-Wattribute-alias]
>
> This patch fixes these warnings. I have done a full bootstrap build and test
> suite run. I have verified that the ifunc handler works correctly, using
> software emulation on a power8 and the hardware instructions on power9. Can I
> check this into the trunk?
Just as a side note, a convenient way to deal with this is to use
typeof to deduce the return type of the resolver from the type of
the function it returns. I would expect something like
the following untested change to do it and make the typedefs
unnecessary:
-static void *
+static __typeof__ (__addkf3_sw) *
__addkf3_resolve (void)
{
- return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw);
+ return SW_OR_HW (__addkf3_sw, __addkf3_hw);
}
Martin
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-11-27 22:55 ` Martin Sebor
@ 2017-11-28 0:55 ` Michael Meissner
2017-11-30 5:08 ` Segher Boessenkool
0 siblings, 1 reply; 12+ messages in thread
From: Michael Meissner @ 2017-11-28 0:55 UTC (permalink / raw)
To: Martin Sebor, Segher Boessenkool
Cc: Michael Meissner, GCC Patches, David Edelsohn, Bill Schmidt
[-- Attachment #1: Type: text/plain, Size: 4090 bytes --]
On Mon, Nov 27, 2017 at 03:40:58PM -0700, Martin Sebor wrote:
> On 11/27/2017 12:21 PM, Michael Meissner wrote:
> >The new -Wattribute-alias option now issues warnings for old-style ifunc
> >declarations that coerce the pointer to the function to void *. The
> >float128-ifunc.c module in libgcc/config/rs6000 now gets a lot of warnings of
> >the form:
> >
> >../float128-ifunc.c:109:1: warning: âifuncâ resolver for â__negkf2â should
> >return âTFtype (*)(TFtype) {aka _Float128 (*)(_Float128)}â [-Wattribute-alias]
> >
> >This patch fixes these warnings. I have done a full bootstrap build and test
> >suite run. I have verified that the ifunc handler works correctly, using
> >software emulation on a power8 and the hardware instructions on power9. Can I
> >check this into the trunk?
>
> Just as a side note, a convenient way to deal with this is to use
> typeof to deduce the return type of the resolver from the type of
> the function it returns. I would expect something like
> the following untested change to do it and make the typedefs
> unnecessary:
>
> -static void *
> +static __typeof__ (__addkf3_sw) *
> __addkf3_resolve (void)
> {
> - return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw);
> + return SW_OR_HW (__addkf3_sw, __addkf3_hw);
> }
>
> Martin
Thanks, that does simplify things. I redid the patch for both PR libgcc/83112
(avoid the warnings in float128-ifunc) and PR libgcc/83103 (optimize complex
float128 multiply/divide when running on ISA 3.0 hardware).
This patch combines both PRs. I have bootstrapped it and done a regression
test with no regressions. Can I install this patch in the trunk?
2017-11-27 Michael Meissner <meissner@linux.vnet.ibm.com>
PR libgcc/83112
* config/rs6000/float128-ifunc.c (__addkf3_resolve): Use the
correct type for all ifunc resolvers to silence -Wattribute-alias
warnings. Eliminate the forward declaration of the resolver
functions which is no longer needed.
(__subkf3_resolve): Likewise.
(__mulkf3_resolve): Likewise.
(__divkf3_resolve): Likewise.
(__negkf2_resolve): Likewise.
(__eqkf2_resolve): Likewise.
(__nekf2_resolve): Likewise.
(__gekf2_resolve): Likewise.
(__gtkf2_resolve): Likewise.
(__lekf2_resolve): Likewise.
(__ltkf2_resolve): Likewise.
(__unordkf2_resolve): Likewise.
(__extendsfkf2_resolve): Likewise.
(__extenddfkf2_resolve): Likewise.
(__trunckfsf2_resolve): Likewise.
(__trunckfdf2_resolve): Likewise.
(__fixkfsi_resolve): Likewise.
(__fixkfdi_resolve): Likewise.
(__fixunskfsi_resolve): Likewise.
(__fixunskfdi_resolve): Likewise.
(__floatsikf_resolve): Likewise.
(__floatdikf_resolve): Likewise.
(__floatunsikf_resolve): Likewise.
(__floatundikf_resolve): Likewise.
(__extendkftf2_resolve): Likewise.
(__trunctfkf2_resolve): Likewise.
PR libgcc/83103
* config/rs6000/quad-float128.h (TF): Don't define if long double
is IEEE 128-bit floating point.
(TCtype): Define as either TCmode or KCmode, depending on whether
long double is IEEE 128-bit floating point.
(__mulkc3_sw): Add declarations for software/hardware versions of
complex multiply/divide.
(__divkc3_sw): Likewise.
(__mulkc3_hw): Likewise.
(__divkc3_hw): Likewise.
* config/rs6000/_mulkc3.c (_mulkc3): If we are building ifunc
handlers to switch between using software emulation and hardware
float128 instructions, build the complex multiply/divide functions
for both software and hardware support.
* config/rs6000/_divkc3.c (_divkc3): Likewise.
* config/rs6000/float128-ifunc.c (__mulkc3_resolve): Likewise.
(__divkc3_resolve): Likewise.
(__mulkc3): Likewise.
(__divkc3): Likewise.
* config/rs6000/t-float128-hw (fp128_hardfp_src): Likewise.
(fp128_hw_src): Likewise.
(fp128_hw_static_obj): Likewise.
(fp128_hw_shared_obj): Likewise.
(_mulkc3-hw.c): Likewise.
(_divkc3-hw.c): Likewise.
* config/rs6000/t-float128 (clean-float128): Delete _mulkc3-hw.c
and _divkc3-hw.c.
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797
[-- Attachment #2: pr83112.patch02b --]
[-- Type: text/plain, Size: 12117 bytes --]
Index: libgcc/config/rs6000/quad-float128.h
===================================================================
--- libgcc/config/rs6000/quad-float128.h (revision 255177)
+++ libgcc/config/rs6000/quad-float128.h (working copy)
@@ -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. */
Index: libgcc/config/rs6000/_mulkc3.c
===================================================================
--- libgcc/config/rs6000/_mulkc3.c (revision 255177)
+++ libgcc/config/rs6000/_mulkc3.c (working copy)
@@ -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)
{
Index: libgcc/config/rs6000/_divkc3.c
===================================================================
--- libgcc/config/rs6000/_divkc3.c (revision 255177)
+++ libgcc/config/rs6000/_divkc3.c (working copy)
@@ -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)
{
Index: libgcc/config/rs6000/float128-ifunc.c
===================================================================
--- libgcc/config/rs6000/float128-ifunc.c (revision 255177)
+++ libgcc/config/rs6000/float128-ifunc.c (working copy)
@@ -54,190 +54,175 @@
128-bit integer types and 128-bit IEEE floating point, or vice versa. So
use the emulator functions for these conversions. */
-static void *__addkf3_resolve (void);
-static void *__subkf3_resolve (void);
-static void *__mulkf3_resolve (void);
-static void *__divkf3_resolve (void);
-static void *__negkf2_resolve (void);
-static void *__eqkf2_resolve (void);
-static void *__nekf2_resolve (void);
-static void *__gekf2_resolve (void);
-static void *__gtkf2_resolve (void);
-static void *__lekf2_resolve (void);
-static void *__ltkf2_resolve (void);
-static void *__unordkf2_resolve (void);
-static void *__extendsfkf2_resolve (void);
-static void *__extenddfkf2_resolve (void);
-static void *__trunckfsf2_resolve (void);
-static void *__trunckfdf2_resolve (void);
-static void *__fixkfsi_resolve (void);
-static void *__fixkfdi_resolve (void);
-static void *__fixunskfsi_resolve (void);
-static void *__fixunskfdi_resolve (void);
-static void *__floatsikf_resolve (void);
-static void *__floatdikf_resolve (void);
-static void *__floatunsikf_resolve (void);
-static void *__floatundikf_resolve (void);
-static void *__extendkftf2_resolve (void);
-static void *__trunctfkf2_resolve (void);
-
-static void *
+static __typeof__ (__addkf3_sw) *
__addkf3_resolve (void)
{
- return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw);
+ return SW_OR_HW (__addkf3_sw, __addkf3_hw);
}
-static void *
+static __typeof__ (__subkf3_sw) *
__subkf3_resolve (void)
{
- return (void *) SW_OR_HW (__subkf3_sw, __subkf3_hw);
+ return SW_OR_HW (__subkf3_sw, __subkf3_hw);
}
-static void *
+static __typeof__ (__mulkf3_sw) *
__mulkf3_resolve (void)
{
- return (void *) SW_OR_HW (__mulkf3_sw, __mulkf3_hw);
+ return SW_OR_HW (__mulkf3_sw, __mulkf3_hw);
}
-static void *
+static __typeof__ (__divkf3_sw) *
__divkf3_resolve (void)
{
- return (void *) SW_OR_HW (__divkf3_sw, __divkf3_hw);
+ return SW_OR_HW (__divkf3_sw, __divkf3_hw);
}
-static void *
+static __typeof__ (__negkf2_sw) *
__negkf2_resolve (void)
{
- return (void *) SW_OR_HW (__negkf2_sw, __negkf2_hw);
+ return SW_OR_HW (__negkf2_sw, __negkf2_hw);
}
-static void *
+static __typeof__ (__floatsikf_sw) *
__floatsikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatsikf_sw, __floatsikf_hw);
+ return SW_OR_HW (__floatsikf_sw, __floatsikf_hw);
}
-static void *
+static __typeof__ (__floatdikf_sw) *
__floatdikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatdikf_sw, __floatdikf_hw);
+ return SW_OR_HW (__floatdikf_sw, __floatdikf_hw);
}
-static void *
+static __typeof__ (__floatunsikf_sw) *
__floatunsikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw);
+ return SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw);
}
-static void *
+static __typeof__ (__floatundikf_sw) *
__floatundikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatundikf_sw, __floatundikf_hw);
+ return SW_OR_HW (__floatundikf_sw, __floatundikf_hw);
}
-static void *
+static __typeof__ (__fixkfsi_sw) *
__fixkfsi_resolve (void)
{
- return (void *) SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw);
+ return SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw);
}
-static void *
+static __typeof__ (__fixkfdi_sw) *
__fixkfdi_resolve (void)
{
- return (void *) SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw);
+ return SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw);
}
-static void *
+static __typeof__ (__fixunskfsi_sw) *
__fixunskfsi_resolve (void)
{
- return (void *) SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw);
+ return SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw);
}
-static void *
+static __typeof__ (__fixunskfdi_sw) *
__fixunskfdi_resolve (void)
{
- return (void *) SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw);
+ return SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw);
}
-static void *
+static __typeof__ (__extendsfkf2_sw) *
__extendsfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw);
+ return SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw);
}
-static void *
+static __typeof__ (__extenddfkf2_sw) *
__extenddfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw);
+ return SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw);
}
-static void *
+static __typeof__ (__trunckfsf2_sw) *
__trunckfsf2_resolve (void)
{
- return (void *) SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw);
+ return SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw);
}
-static void *
+static __typeof__ (__trunckfdf2_sw) *
__trunckfdf2_resolve (void)
{
return (void *) SW_OR_HW (__trunckfdf2_sw, __trunckfdf2_hw);
}
-static void *
+static __typeof__ (__extendkftf2_sw) *
__extendkftf2_resolve (void)
{
- return (void *) SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw);
+ return SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw);
}
-static void *
+static __typeof__ (__trunctfkf2_sw) *
__trunctfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw);
+ return SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw);
}
-static void *
+static __typeof__ (__mulkc3_sw) *
+__mulkc3_resolve (void)
+{
+ return SW_OR_HW (__mulkc3_sw, __mulkc3_hw);
+}
+
+static __typeof__ (__divkc3_sw) *
+__divkc3_resolve (void)
+{
+ return SW_OR_HW (__divkc3_sw, __divkc3_hw);
+}
+
+static __typeof__ (__eqkf2_sw) *
__eqkf2_resolve (void)
{
- return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
+ return SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
}
-static void *
+static __typeof__ (__gekf2_sw) *
__gekf2_resolve (void)
{
- return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw);
+ return SW_OR_HW (__gekf2_sw, __gekf2_hw);
}
-static void *
+static __typeof__ (__lekf2_sw) *
__lekf2_resolve (void)
{
- return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw);
+ return SW_OR_HW (__lekf2_sw, __lekf2_hw);
}
-static void *
+static __typeof__ (__unordkf2_sw) *
__unordkf2_resolve (void)
{
- return (void *) SW_OR_HW (__unordkf2_sw, __unordkf2_hw);
+ return SW_OR_HW (__unordkf2_sw, __unordkf2_hw);
}
/* Resolve __nekf2, __gtkf2, __ltkf2 like __eqkf2, __gekf2, and __lekf2, since
the functions return the same values. */
-static void *
+static __typeof__ (__eqkf2_sw) *
__nekf2_resolve (void)
{
- return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
+ return SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
}
-static void *
+static __typeof__ (__eqkf2_sw) *
__gtkf2_resolve (void)
{
- return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw);
+ return SW_OR_HW (__gekf2_sw, __gekf2_hw);
}
-static void *
+static __typeof__ (__eqkf2_sw) *
__ltkf2_resolve (void)
{
- return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw);
+ return SW_OR_HW (__lekf2_sw, __lekf2_hw);
}
@@ -320,3 +305,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")));
Index: libgcc/config/rs6000/t-float128-hw
===================================================================
--- libgcc/config/rs6000/t-float128-hw (revision 255177)
+++ libgcc/config/rs6000/t-float128-hw (working copy)
@@ -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
Index: libgcc/config/rs6000/t-float128
===================================================================
--- libgcc/config/rs6000/t-float128 (revision 255177)
+++ libgcc/config/rs6000/t-float128 (working copy)
@@ -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
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-11-28 0:55 ` Michael Meissner
@ 2017-11-30 5:08 ` Segher Boessenkool
2017-11-30 21:52 ` Michael Meissner
0 siblings, 1 reply; 12+ messages in thread
From: Segher Boessenkool @ 2017-11-30 5:08 UTC (permalink / raw)
To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
Hi,
On Mon, Nov 27, 2017 at 06:40:09PM -0500, Michael Meissner wrote:
> @@ -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
Please don't -rf. -rf is a dangerous habit.
This also won't work if anything tries to build _mulkc3-hw.c a second
time; you have deleted its prerequisite.
Maybe some other scheme is better?
> --- libgcc/config/rs6000/t-float128 (revision 255177)
> +++ libgcc/config/rs6000/t-float128 (working copy)
> @@ -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
-rm to avoid warnings from rm if you clean without the files being there.
Otherwise looks good. Thanks!
Segher
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-11-30 5:08 ` Segher Boessenkool
@ 2017-11-30 21:52 ` Michael Meissner
2017-12-01 5:40 ` Michael Meissner
0 siblings, 1 reply; 12+ messages in thread
From: Michael Meissner @ 2017-11-30 21:52 UTC (permalink / raw)
To: Segher Boessenkool
Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
[-- Attachment #1: Type: text/plain, Size: 3833 bytes --]
On Wed, Nov 29, 2017 at 08:42:51PM -0600, Segher Boessenkool wrote:
> Hi,
>
> On Mon, Nov 27, 2017 at 06:40:09PM -0500, Michael Meissner wrote:
> > @@ -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
>
> Please don't -rf. -rf is a dangerous habit.
>
> This also won't work if anything tries to build _mulkc3-hw.c a second
> time; you have deleted its prerequisite.
>
> Maybe some other scheme is better?
>
> > --- libgcc/config/rs6000/t-float128 (revision 255177)
> > +++ libgcc/config/rs6000/t-float128 (working copy)
> > @@ -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
>
> -rm to avoid warnings from rm if you clean without the files being there.
>
> Otherwise looks good. Thanks!
As we discussed on private IRC, I mistakenly deleted the _{mul,div}kc3.c file
when I meant to delete the _{mul,div}kc3-hw.c file before recreating it.
This is the patch I checked in (subversion id 255282):
2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com>
PR libgcc/83112
* config/rs6000/float128-ifunc.c (__addkf3_resolve): Use the
correct type for all ifunc resolvers to silence -Wattribute-alias
warnings. Eliminate the forward declaration of the resolver
functions which is no longer needed.
(__subkf3_resolve): Likewise.
(__mulkf3_resolve): Likewise.
(__divkf3_resolve): Likewise.
(__negkf2_resolve): Likewise.
(__eqkf2_resolve): Likewise.
(__nekf2_resolve): Likewise.
(__gekf2_resolve): Likewise.
(__gtkf2_resolve): Likewise.
(__lekf2_resolve): Likewise.
(__ltkf2_resolve): Likewise.
(__unordkf2_resolve): Likewise.
(__extendsfkf2_resolve): Likewise.
(__extenddfkf2_resolve): Likewise.
(__trunckfsf2_resolve): Likewise.
(__trunckfdf2_resolve): Likewise.
(__fixkfsi_resolve): Likewise.
(__fixkfdi_resolve): Likewise.
(__fixunskfsi_resolve): Likewise.
(__fixunskfdi_resolve): Likewise.
(__floatsikf_resolve): Likewise.
(__floatdikf_resolve): Likewise.
(__floatunsikf_resolve): Likewise.
(__floatundikf_resolve): Likewise.
(__extendkftf2_resolve): Likewise.
(__trunctfkf2_resolve): Likewise.
PR libgcc/83103
* config/rs6000/quad-float128.h (TF): Don't define if long double
is IEEE 128-bit floating point.
(TCtype): Define as either TCmode or KCmode, depending on whether
long double is IEEE 128-bit floating point.
(__mulkc3_sw): Add declarations for software/hardware versions of
complex multiply/divide.
(__divkc3_sw): Likewise.
(__mulkc3_hw): Likewise.
(__divkc3_hw): Likewise.
* config/rs6000/_mulkc3.c (_mulkc3): If we are building ifunc
handlers to switch between using software emulation and hardware
float128 instructions, build the complex multiply/divide functions
for both software and hardware support.
* config/rs6000/_divkc3.c (_divkc3): Likewise.
* config/rs6000/float128-ifunc.c (__mulkc3_resolve): Likewise.
(__divkc3_resolve): Likewise.
(__mulkc3): Likewise.
(__divkc3): Likewise.
* config/rs6000/t-float128-hw (fp128_hardfp_src): Likewise.
(fp128_hw_src): Likewise.
(fp128_hw_static_obj): Likewise.
(fp128_hw_shared_obj): Likewise.
(_mulkc3-hw.c): Likewise.
(_divkc3-hw.c): Likewise.
* config/rs6000/t-float128 (clean-float128): Delete _mulkc3-hw.c
and _divkc3-hw.c.
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797
[-- Attachment #2: pr83112.patch03b --]
[-- Type: text/plain, Size: 12079 bytes --]
Index: libgcc/config/rs6000/quad-float128.h
===================================================================
--- libgcc/config/rs6000/quad-float128.h (revision 255281)
+++ libgcc/config/rs6000/quad-float128.h (working copy)
@@ -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. */
Index: libgcc/config/rs6000/_mulkc3.c
===================================================================
--- libgcc/config/rs6000/_mulkc3.c (revision 255281)
+++ libgcc/config/rs6000/_mulkc3.c (working copy)
@@ -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)
{
Index: libgcc/config/rs6000/_divkc3.c
===================================================================
--- libgcc/config/rs6000/_divkc3.c (revision 255281)
+++ libgcc/config/rs6000/_divkc3.c (working copy)
@@ -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)
{
Index: libgcc/config/rs6000/float128-ifunc.c
===================================================================
--- libgcc/config/rs6000/float128-ifunc.c (revision 255281)
+++ libgcc/config/rs6000/float128-ifunc.c (working copy)
@@ -54,190 +54,175 @@
128-bit integer types and 128-bit IEEE floating point, or vice versa. So
use the emulator functions for these conversions. */
-static void *__addkf3_resolve (void);
-static void *__subkf3_resolve (void);
-static void *__mulkf3_resolve (void);
-static void *__divkf3_resolve (void);
-static void *__negkf2_resolve (void);
-static void *__eqkf2_resolve (void);
-static void *__nekf2_resolve (void);
-static void *__gekf2_resolve (void);
-static void *__gtkf2_resolve (void);
-static void *__lekf2_resolve (void);
-static void *__ltkf2_resolve (void);
-static void *__unordkf2_resolve (void);
-static void *__extendsfkf2_resolve (void);
-static void *__extenddfkf2_resolve (void);
-static void *__trunckfsf2_resolve (void);
-static void *__trunckfdf2_resolve (void);
-static void *__fixkfsi_resolve (void);
-static void *__fixkfdi_resolve (void);
-static void *__fixunskfsi_resolve (void);
-static void *__fixunskfdi_resolve (void);
-static void *__floatsikf_resolve (void);
-static void *__floatdikf_resolve (void);
-static void *__floatunsikf_resolve (void);
-static void *__floatundikf_resolve (void);
-static void *__extendkftf2_resolve (void);
-static void *__trunctfkf2_resolve (void);
-
-static void *
+static __typeof__ (__addkf3_sw) *
__addkf3_resolve (void)
{
- return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw);
+ return SW_OR_HW (__addkf3_sw, __addkf3_hw);
}
-static void *
+static __typeof__ (__subkf3_sw) *
__subkf3_resolve (void)
{
- return (void *) SW_OR_HW (__subkf3_sw, __subkf3_hw);
+ return SW_OR_HW (__subkf3_sw, __subkf3_hw);
}
-static void *
+static __typeof__ (__mulkf3_sw) *
__mulkf3_resolve (void)
{
- return (void *) SW_OR_HW (__mulkf3_sw, __mulkf3_hw);
+ return SW_OR_HW (__mulkf3_sw, __mulkf3_hw);
}
-static void *
+static __typeof__ (__divkf3_sw) *
__divkf3_resolve (void)
{
- return (void *) SW_OR_HW (__divkf3_sw, __divkf3_hw);
+ return SW_OR_HW (__divkf3_sw, __divkf3_hw);
}
-static void *
+static __typeof__ (__negkf2_sw) *
__negkf2_resolve (void)
{
- return (void *) SW_OR_HW (__negkf2_sw, __negkf2_hw);
+ return SW_OR_HW (__negkf2_sw, __negkf2_hw);
}
-static void *
+static __typeof__ (__floatsikf_sw) *
__floatsikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatsikf_sw, __floatsikf_hw);
+ return SW_OR_HW (__floatsikf_sw, __floatsikf_hw);
}
-static void *
+static __typeof__ (__floatdikf_sw) *
__floatdikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatdikf_sw, __floatdikf_hw);
+ return SW_OR_HW (__floatdikf_sw, __floatdikf_hw);
}
-static void *
+static __typeof__ (__floatunsikf_sw) *
__floatunsikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw);
+ return SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw);
}
-static void *
+static __typeof__ (__floatundikf_sw) *
__floatundikf_resolve (void)
{
- return (void *) SW_OR_HW (__floatundikf_sw, __floatundikf_hw);
+ return SW_OR_HW (__floatundikf_sw, __floatundikf_hw);
}
-static void *
+static __typeof__ (__fixkfsi_sw) *
__fixkfsi_resolve (void)
{
- return (void *) SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw);
+ return SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw);
}
-static void *
+static __typeof__ (__fixkfdi_sw) *
__fixkfdi_resolve (void)
{
- return (void *) SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw);
+ return SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw);
}
-static void *
+static __typeof__ (__fixunskfsi_sw) *
__fixunskfsi_resolve (void)
{
- return (void *) SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw);
+ return SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw);
}
-static void *
+static __typeof__ (__fixunskfdi_sw) *
__fixunskfdi_resolve (void)
{
- return (void *) SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw);
+ return SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw);
}
-static void *
+static __typeof__ (__extendsfkf2_sw) *
__extendsfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw);
+ return SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw);
}
-static void *
+static __typeof__ (__extenddfkf2_sw) *
__extenddfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw);
+ return SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw);
}
-static void *
+static __typeof__ (__trunckfsf2_sw) *
__trunckfsf2_resolve (void)
{
- return (void *) SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw);
+ return SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw);
}
-static void *
+static __typeof__ (__trunckfdf2_sw) *
__trunckfdf2_resolve (void)
{
return (void *) SW_OR_HW (__trunckfdf2_sw, __trunckfdf2_hw);
}
-static void *
+static __typeof__ (__extendkftf2_sw) *
__extendkftf2_resolve (void)
{
- return (void *) SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw);
+ return SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw);
}
-static void *
+static __typeof__ (__trunctfkf2_sw) *
__trunctfkf2_resolve (void)
{
- return (void *) SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw);
+ return SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw);
}
-static void *
+static __typeof__ (__mulkc3_sw) *
+__mulkc3_resolve (void)
+{
+ return SW_OR_HW (__mulkc3_sw, __mulkc3_hw);
+}
+
+static __typeof__ (__divkc3_sw) *
+__divkc3_resolve (void)
+{
+ return SW_OR_HW (__divkc3_sw, __divkc3_hw);
+}
+
+static __typeof__ (__eqkf2_sw) *
__eqkf2_resolve (void)
{
- return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
+ return SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
}
-static void *
+static __typeof__ (__gekf2_sw) *
__gekf2_resolve (void)
{
- return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw);
+ return SW_OR_HW (__gekf2_sw, __gekf2_hw);
}
-static void *
+static __typeof__ (__lekf2_sw) *
__lekf2_resolve (void)
{
- return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw);
+ return SW_OR_HW (__lekf2_sw, __lekf2_hw);
}
-static void *
+static __typeof__ (__unordkf2_sw) *
__unordkf2_resolve (void)
{
- return (void *) SW_OR_HW (__unordkf2_sw, __unordkf2_hw);
+ return SW_OR_HW (__unordkf2_sw, __unordkf2_hw);
}
/* Resolve __nekf2, __gtkf2, __ltkf2 like __eqkf2, __gekf2, and __lekf2, since
the functions return the same values. */
-static void *
+static __typeof__ (__eqkf2_sw) *
__nekf2_resolve (void)
{
- return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
+ return SW_OR_HW (__eqkf2_sw, __eqkf2_hw);
}
-static void *
+static __typeof__ (__eqkf2_sw) *
__gtkf2_resolve (void)
{
- return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw);
+ return SW_OR_HW (__gekf2_sw, __gekf2_hw);
}
-static void *
+static __typeof__ (__eqkf2_sw) *
__ltkf2_resolve (void)
{
- return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw);
+ return SW_OR_HW (__lekf2_sw, __lekf2_hw);
}
@@ -320,3 +305,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")));
Index: libgcc/config/rs6000/t-float128-hw
===================================================================
--- libgcc/config/rs6000/t-float128-hw (revision 255281)
+++ libgcc/config/rs6000/t-float128-hw (working copy)
@@ -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,11 @@ $(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
+ (echo "#define __mulkc3 __mulkc3_hw"; \
+ cat $(srcdir)/config/rs6000/_mulkc3.c) > _mulkc3-hw.c
+
+_divkc3-hw.c: $(srcdir)/config/rs6000/_divkc3.c
+ (echo "#define __divkc3 __divkc3_hw"; \
+ cat $(srcdir)/config/rs6000/_divkc3.c) > _divkc3-hw.c
Index: libgcc/config/rs6000/t-float128
===================================================================
--- libgcc/config/rs6000/t-float128 (revision 255281)
+++ libgcc/config/rs6000/t-float128 (working copy)
@@ -86,7 +86,7 @@ test:
for x in $(fp128_obj); do echo " $$x"; done;
clean-float128:
- rm -rf $(fp128_softfp_src)
+ -rm -f $(fp128_softfp_src) $(fp128_hardfp_src)
@$(MULTICLEAN) multi-clean DO=clean-float128
# For now, only put it in the static library
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-11-30 21:52 ` Michael Meissner
@ 2017-12-01 5:40 ` Michael Meissner
2017-12-01 23:54 ` Segher Boessenkool
0 siblings, 1 reply; 12+ messages in thread
From: Michael Meissner @ 2017-12-01 5:40 UTC (permalink / raw)
To: Michael Meissner, Segher Boessenkool, Martin Sebor, GCC Patches,
David Edelsohn, Bill Schmidt
After committing the previous patch, I noticed that it was now generating
warnings for __{mul,div}kc3_{sw,hw} not having a prototype that I hadn't
noticed during development of the patch. This is due to the fact that before I
added the ifunc support, it was only compiling __{mul,div}kc3, and those have
built-in declarations. I installed this patch as being obvious:
2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com>
* config/rs6000/_mulkc3.c (__mulkc3): Add forward declaration.
* config/rs6000/_divkc3.c (__divkc3): Likewise.
Index: libgcc/config/rs6000/_divkc3.c
===================================================================
--- libgcc/config/rs6000/_divkc3.c (revision 255288)
+++ libgcc/config/rs6000/_divkc3.c (working copy)
@@ -37,6 +37,8 @@ typedef __complex float KCtype __attribu
#define __divkc3 __divkc3_sw
#endif
+extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype);
+
KCtype
__divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
{
Index: libgcc/config/rs6000/_mulkc3.c
===================================================================
--- libgcc/config/rs6000/_mulkc3.c (revision 255288)
+++ libgcc/config/rs6000/_mulkc3.c (working copy)
@@ -35,6 +35,8 @@ typedef __complex float KCtype __attribu
#define __mulkc3 __mulkc3_sw
#endif
+extern KCtype __mulkc3 (KFtype, KFtype, KFtype, KFtype);
+
KCtype
__mulkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
{
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-12-01 5:40 ` Michael Meissner
@ 2017-12-01 23:54 ` Segher Boessenkool
2017-12-11 20:58 ` Michael Meissner
0 siblings, 1 reply; 12+ messages in thread
From: Segher Boessenkool @ 2017-12-01 23:54 UTC (permalink / raw)
To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
On Fri, Dec 01, 2017 at 12:40:22AM -0500, Michael Meissner wrote:
> After committing the previous patch, I noticed that it was now generating
> warnings for __{mul,div}kc3_{sw,hw} not having a prototype that I hadn't
> noticed during development of the patch. This is due to the fact that before I
> added the ifunc support, it was only compiling __{mul,div}kc3, and those have
> built-in declarations. I installed this patch as being obvious:
>
> 2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com>
>
> * config/rs6000/_mulkc3.c (__mulkc3): Add forward declaration.
> * config/rs6000/_divkc3.c (__divkc3): Likewise.
>
> Index: libgcc/config/rs6000/_divkc3.c
> ===================================================================
> --- libgcc/config/rs6000/_divkc3.c (revision 255288)
> +++ libgcc/config/rs6000/_divkc3.c (working copy)
> @@ -37,6 +37,8 @@ typedef __complex float KCtype __attribu
> #define __divkc3 __divkc3_sw
> #endif
>
> +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype);
> +
> KCtype
> __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
> {
How does this warn? -Wmissing-declarations? Should this declaration be
in a header then?
A code comment explaining why you do a declaration for exactly the same
thing as there is two lines later would help; otherwise people will try
to delete it again :-)
Segher
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-12-01 23:54 ` Segher Boessenkool
@ 2017-12-11 20:58 ` Michael Meissner
2017-12-12 17:05 ` Segher Boessenkool
0 siblings, 1 reply; 12+ messages in thread
From: Michael Meissner @ 2017-12-11 20:58 UTC (permalink / raw)
To: Segher Boessenkool
Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
On Fri, Dec 01, 2017 at 05:53:55PM -0600, Segher Boessenkool wrote:
> On Fri, Dec 01, 2017 at 12:40:22AM -0500, Michael Meissner wrote:
> > After committing the previous patch, I noticed that it was now generating
> > warnings for __{mul,div}kc3_{sw,hw} not having a prototype that I hadn't
> > noticed during development of the patch. This is due to the fact that before I
> > added the ifunc support, it was only compiling __{mul,div}kc3, and those have
> > built-in declarations. I installed this patch as being obvious:
> >
> > 2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com>
> >
> > * config/rs6000/_mulkc3.c (__mulkc3): Add forward declaration.
> > * config/rs6000/_divkc3.c (__divkc3): Likewise.
> >
> > Index: libgcc/config/rs6000/_divkc3.c
> > ===================================================================
> > --- libgcc/config/rs6000/_divkc3.c (revision 255288)
> > +++ libgcc/config/rs6000/_divkc3.c (working copy)
> > @@ -37,6 +37,8 @@ typedef __complex float KCtype __attribu
> > #define __divkc3 __divkc3_sw
> > #endif
> >
> > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype);
> > +
> > KCtype
> > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
> > {
>
> How does this warn? -Wmissing-declarations? Should this declaration be
> in a header then?
The compiler creates the call to __mulkc3 and __divkc3, and internally it has
the appropriate prototype like it does for all built-in functions (in this
case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments).
So before adding ifunc support, we never noticed it didn't have a prototype,
because the compiler already has a prototype.
With ifunc support, we now need to create two separate functions, __mulkc3_sw
and __mulkc3_hw, and make __multkc3 the ifunc resolver.
So there really isn't an include file that is appropriate to put the
definitions in. I could change it to use the soft-fp includes (including
quadmath-float128.h) if desired.
Did you want me to do that?
> A code comment explaining why you do a declaration for exactly the same
> thing as there is two lines later would help; otherwise people will try
> to delete it again :-)
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-12-11 20:58 ` Michael Meissner
@ 2017-12-12 17:05 ` Segher Boessenkool
2017-12-12 17:18 ` Andreas Schwab
2017-12-12 21:56 ` Michael Meissner
0 siblings, 2 replies; 12+ messages in thread
From: Segher Boessenkool @ 2017-12-12 17:05 UTC (permalink / raw)
To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote:
> > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype);
> > > +
> > > KCtype
> > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
> > > {
> >
> > How does this warn? -Wmissing-declarations? Should this declaration be
> > in a header then?
>
> The compiler creates the call to __mulkc3 and __divkc3, and internally it has
> the appropriate prototype like it does for all built-in functions (in this
> case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments).
>
> So before adding ifunc support, we never noticed it didn't have a prototype,
> because the compiler already has a prototype.
I still don't get it. A function definition is also a declaration.
Something very non-intuitive is happening?
What does the patch change here?
> With ifunc support, we now need to create two separate functions, __mulkc3_sw
> and __mulkc3_hw, and make __multkc3 the ifunc resolver.
>
> So there really isn't an include file that is appropriate to put the
> definitions in. I could change it to use the soft-fp includes (including
> quadmath-float128.h) if desired.
>
> Did you want me to do that?
I don't see the point in adding a second declaration right before the
existing declaration (the function definition). I'm fine with what file
it is in.
> > A code comment explaining why you do a declaration for exactly the same
> > thing as there is two lines later would help; otherwise people will try
> > to delete it again :-)
Segher
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-12-12 17:05 ` Segher Boessenkool
@ 2017-12-12 17:18 ` Andreas Schwab
2017-12-12 21:56 ` Michael Meissner
1 sibling, 0 replies; 12+ messages in thread
From: Andreas Schwab @ 2017-12-12 17:18 UTC (permalink / raw)
To: Segher Boessenkool
Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
On Dez 12 2017, Segher Boessenkool <segher@kernel.crashing.org> wrote:
> On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote:
>> > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype);
>> > > +
>> > > KCtype
>> > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
>> > > {
>> >
>> > How does this warn? -Wmissing-declarations? Should this declaration be
>> > in a header then?
>>
>> The compiler creates the call to __mulkc3 and __divkc3, and internally it has
>> the appropriate prototype like it does for all built-in functions (in this
>> case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments).
>>
>> So before adding ifunc support, we never noticed it didn't have a prototype,
>> because the compiler already has a prototype.
>
> I still don't get it. A function definition is also a declaration.
>
> Something very non-intuitive is happening?
`-Wmissing-prototypes (C and Objective-C only)'
Warn if a global function is defined without a previous prototype
declaration. This warning is issued even if the definition itself
provides a prototype.
Andreas.
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-12-12 17:05 ` Segher Boessenkool
2017-12-12 17:18 ` Andreas Schwab
@ 2017-12-12 21:56 ` Michael Meissner
2017-12-13 20:57 ` Segher Boessenkool
1 sibling, 1 reply; 12+ messages in thread
From: Michael Meissner @ 2017-12-12 21:56 UTC (permalink / raw)
To: Segher Boessenkool
Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
On Tue, Dec 12, 2017 at 11:04:55AM -0600, Segher Boessenkool wrote:
> On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote:
> > > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype);
> > > > +
> > > > KCtype
> > > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
> > > > {
> > >
> > > How does this warn? -Wmissing-declarations? Should this declaration be
> > > in a header then?
> >
> > The compiler creates the call to __mulkc3 and __divkc3, and internally it has
> > the appropriate prototype like it does for all built-in functions (in this
> > case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments).
> >
> > So before adding ifunc support, we never noticed it didn't have a prototype,
> > because the compiler already has a prototype.
>
> I still don't get it. A function definition is also a declaration.
>
> Something very non-intuitive is happening?
GCC has the following function declarations built-in:
extern _Float128 _Complex __mulkc3 (_Float128, _Float128, _Float128, _Float128);
extern _Float128 _Complex __divkc3 (_Float128, _Float128, _Float128, _Float128);
Before the patch, _mulkc3.c looked like:
_Float128 _Complex
__mulkc3 (_Float128 a, _Float128 b, _Float128 c, _Float128 d)
{
// ...
}
Now, with ifunc handling it gets compiled in three separate files:
First in a file compiled with -mno-float128-hardware:
_Float128 _Complex
__mulkc3_sw (_Float128 a, _Float128 b, _Float128 c, _Float128 d)
{
// ...
}
Second in a file compiled with -mfloat128-hardware:
_Float128 _Complex
__mulkc3_hw (_Float128 a, _Float128 b, _Float128 c, _Float128 d)
{
// ...
}
And third as the ifunc handler:
#define SW_OR_HW(SW, HW) (__builtin_cpu_supports ("ieee128") ? HW : SW)
static __typeof__ (__mulkc3_sw) *
__mulkc3_resolve (void)
{
return SW_OR_HW (__mulkc3_sw, __mulkc3_hw);
}
_Float128 _Complex __mulkc3 (Float128, _Float128, _Float128, _Float128)
__attribute__ ((__ifunc__ ("__mulkc3_resolve")));
As Andreas points out, the option -Wmissing-prototypes complains if a global
function is compliled without prototypes for C/Objective C.
Before the patch, the internal definition within the compiler meant that that
__mulkc3 would not get the warning. Now with separate ifunc handlers, both
__mulkc3_sw and __mulkc3_hw got warnings.
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c
2017-12-12 21:56 ` Michael Meissner
@ 2017-12-13 20:57 ` Segher Boessenkool
0 siblings, 0 replies; 12+ messages in thread
From: Segher Boessenkool @ 2017-12-13 20:57 UTC (permalink / raw)
To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn,
Bill Schmidt
On Tue, Dec 12, 2017 at 04:56:36PM -0500, Michael Meissner wrote:
> On Tue, Dec 12, 2017 at 11:04:55AM -0600, Segher Boessenkool wrote:
> > On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote:
> > > > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype);
> > > > > +
> > > > > KCtype
> > > > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
> > > > > {
> > > >
> > > > How does this warn? -Wmissing-declarations? Should this declaration be
> > > > in a header then?
> As Andreas points out, the option -Wmissing-prototypes complains if a global
> function is compliled without prototypes for C/Objective C.
>
> Before the patch, the internal definition within the compiler meant that that
> __mulkc3 would not get the warning. Now with separate ifunc handlers, both
> __mulkc3_sw and __mulkc3_hw got warnings.
Gotcha. There isn't a nice header file for it, so sure that is fine
the way you have it. Thanks for the explanation!
Segher
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2017-12-13 20:57 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-27 19:57 [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c Michael Meissner
2017-11-27 22:55 ` Martin Sebor
2017-11-28 0:55 ` Michael Meissner
2017-11-30 5:08 ` Segher Boessenkool
2017-11-30 21:52 ` Michael Meissner
2017-12-01 5:40 ` Michael Meissner
2017-12-01 23:54 ` Segher Boessenkool
2017-12-11 20:58 ` Michael Meissner
2017-12-12 17:05 ` Segher Boessenkool
2017-12-12 17:18 ` Andreas Schwab
2017-12-12 21:56 ` Michael Meissner
2017-12-13 20:57 ` Segher Boessenkool
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).