Re: [PATCH], PowerPC IEEE 128-bit fp, #11-rev4 (enable libgcc conversions)
On Wed, Jan 20, 2016 at 8:00 PM, Michael Meissnerwrote: > This is revision 4 of the IEEE 128-bit floating point libgcc support. > > Since revision 3, I have removed the gcc changes that broke AIX. I rewrote > the > IBM extended double pack/unpack support to not use the builtin functions, but > instead uses a union. The libgcc code that I wrote tickles a bug in the pack > function. While I would like to fix the pack function bug, I will need to > make > sure I don't break AIX, so I didn't want to couple this library to getting > those bugs fixed. > > I have also rewritten how the ifunc support is done, so that ifunc is only > done > if the target assembler supports ISA 3.0 instructions AND the compiler > supports > ifunc functions. This is so that the compiler can build on 64-bit systems if > --enable-gnu-indirect-function is not specified without the ifunc functions > being flagged. > > I have done bootstraps on both a big endian power7 system and a little endian > power8 with no regressions. In addition, I have built a compiler explicitly > disabling ifunc support, and it built and ran the ieee 128-bit floating point > unit tests correctly. > > Can I install this into libgcc? > > Assuming I can install these changes, the one final change that I would like > to > make is to enable float128 automatically on VSX powerpc Linux systems, but not > on other systems (AIX, *BSD, etc.) since those systems do not build float128 > emulator functions. What does "enable" mean? > 2016-01-20 Michael Meissner > Steven Munroe > Tulio Magno Quites Machado Filho > > * config/rs6000/float128-sed: New files to convert TF names to KF > names for PowerPC IEEE 128-bit floating point support. > * config/rs6000/float128-sed-hw: Likewise. > > * config/rs6000/float128-hw.c: New file for ISA 3.0 IEEE 128-bit > floating point hardware support. > > * config/rs6000/float128-ifunc.c: New file to pick either IEEE > 128-bit floating point software emulation or use ISA 3.0 hardware > support if it is available. > > * config/rs6000/quad-float128.h: New file to support IEEE 128-bit > floating point. > > * config/rs6000/extendkftf2-sw.c: New file, convert IEEE 128-bit > floating point to IBM extended double. > > * config/rs6000/trunctfkf2-sw.c: New file, convert IBM extended > double to IEEE 128-bit floating point. > > * config/rs6000/t-float128: New Makefile fragments to enable > building __float128 emulation support. > * config/rs6000/t-float128-hw: Likewise. > > * config/rs6000/sfp-exceptions.c: New file to provide exception > support for IEEE 128-bit floating point. > > * config/rs6000/floattikf.c: New files for converting between IEEE > 128-bit floating point and signed/unsigned 128-bit integers. > * config/rs6000/fixunskfti.c: Likewise. > * config/rs6000/fixkfti.c: Likewise. > * config/rs6000/floatuntikf.c: Likewise. > > * config/rs6000/sfp-machine.h (_FP_W_TYPE_SIZE): Use 64-bit types > when building on 64-bit systems, or when VSX is enabled. > (_FP_W_TYPE): Likewise. > (_FP_WS_TYPE): Likewise. > (_FP_I_TYPE): Likewise. > (TItype): Define on 64-bit systems. > (UTItype): Likewise. > (TI_BITS): Likewise. > (_FP_MUL_MEAT_D): Add support for using 64-bit types. > (_FP_MUL_MEAT_Q): Likewise. > (_FP_DIV_MEAT_D): Likewise. > (_FP_DIV_MEAT_Q): Likewise. > (_FP_NANFRAC_D): Likewise. > (_FP_NANFRAC_Q): Likewise. > (ISA_BIT): Add exception support if we are being compiled on a > machine with hardware floating point support to build the IEEE > 128-bit emulation functions. > (FP_EX_INVALID): Likewise. > (FP_EX_OVERFLOW): Likewise. > (FP_EX_UNDERFLOW): Likewise. > (FP_EX_DIVZERO): Likewise. > (FP_EX_INEXACT): Likewise. > (FP_EX_ALL): Likewise. > (__sfp_handle_exceptions): Likewise. > (FP_HANDLE_EXCEPTIONS): Likewise. > (FP_RND_NEAREST): Likewise. > (FP_RND_ZERO): Likewise. > (FP_RND_PINF): Likewise. > (FP_RND_MINF): Likewise. > (FP_RND_MASK): Likewise. > (_FP_DECL_EX): Likewise. > (FP_INIT_ROUNDMODE): Likewise. > (FP_ROUNDMODE): Likewise. > > * libgcc/config.host (powerpc*-*-linux*): If compiler can compile > VSX code, enable IEEE 128-bit floating point. If the compiler can > compile IEEE 128-bit floating point code with ISA 3.0 IEEE 128-bit > floating point hardware instructions and it supports declaring > functions with the ifunc attribute, enable ifunc functions to > switch between software and hardware
Re: [PATCH], PowerPC IEEE 128-bit fp, #11-rev4 (enable libgcc conversions)
On Thu, Jan 21, 2016 at 08:28:05AM -0500, David Edelsohn wrote: > On Wed, Jan 20, 2016 at 8:00 PM, Michael Meissner >wrote: > > This is revision 4 of the IEEE 128-bit floating point libgcc support. > > > > Since revision 3, I have removed the gcc changes that broke AIX. I rewrote > > the > > IBM extended double pack/unpack support to not use the builtin functions, > > but > > instead uses a union. The libgcc code that I wrote tickles a bug in the > > pack > > function. While I would like to fix the pack function bug, I will need to > > make > > sure I don't break AIX, so I didn't want to couple this library to getting > > those bugs fixed. > > > > I have also rewritten how the ifunc support is done, so that ifunc is only > > done > > if the target assembler supports ISA 3.0 instructions AND the compiler > > supports > > ifunc functions. This is so that the compiler can build on 64-bit systems > > if > > --enable-gnu-indirect-function is not specified without the ifunc functions > > being flagged. > > > > I have done bootstraps on both a big endian power7 system and a little > > endian > > power8 with no regressions. In addition, I have built a compiler explicitly > > disabling ifunc support, and it built and ran the ieee 128-bit floating > > point > > unit tests correctly. > > > > Can I install this into libgcc? > > > > Assuming I can install these changes, the one final change that I would > > like to > > make is to enable float128 automatically on VSX powerpc Linux systems, but > > not > > on other systems (AIX, *BSD, etc.) since those systems do not build float128 > > emulator functions. > > What does "enable" mean? I would prefer users being able to use __float128 without having to use the -mfloat128 option on power7/power8/power9 systems. Since we currently only build the emulation for PowerPC Linux systems, I don't think we want to enable it by default without enabling the emulation on those other systems. This means, I probably don't want to put OPTION_MASK_FLOAT128 into ISA_2_6_MASKS_SERVER in rs6000-cpus.def, but instead turn it on in the option handling in rs6000.c if the switch was not done by the user, and we are targetting a VSX Linux system. If you want AIX support, in theory it should be doable. However, it has been a long time since I used AIX, and I will need to refresh my memories on the capabilities of the object file format currently used (in particular, does ifunc and aliases work). For *BSD, it may be more problematical. We've had at least one query about getting __float128 to work on non-VSX systems. Obviously, it won't be in GCC 6, but it may come up in GCC 7. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797
Re: [PATCH], PowerPC IEEE 128-bit fp, #11-rev4 (enable libgcc conversions)
This is revision 4 of the IEEE 128-bit floating point libgcc support. Since revision 3, I have removed the gcc changes that broke AIX. I rewrote the IBM extended double pack/unpack support to not use the builtin functions, but instead uses a union. The libgcc code that I wrote tickles a bug in the pack function. While I would like to fix the pack function bug, I will need to make sure I don't break AIX, so I didn't want to couple this library to getting those bugs fixed. I have also rewritten how the ifunc support is done, so that ifunc is only done if the target assembler supports ISA 3.0 instructions AND the compiler supports ifunc functions. This is so that the compiler can build on 64-bit systems if --enable-gnu-indirect-function is not specified without the ifunc functions being flagged. I have done bootstraps on both a big endian power7 system and a little endian power8 with no regressions. In addition, I have built a compiler explicitly disabling ifunc support, and it built and ran the ieee 128-bit floating point unit tests correctly. Can I install this into libgcc? Assuming I can install these changes, the one final change that I would like to make is to enable float128 automatically on VSX powerpc Linux systems, but not on other systems (AIX, *BSD, etc.) since those systems do not build float128 emulator functions. 2016-01-20 Michael MeissnerSteven Munroe Tulio Magno Quites Machado Filho * config/rs6000/float128-sed: New files to convert TF names to KF names for PowerPC IEEE 128-bit floating point support. * config/rs6000/float128-sed-hw: Likewise. * config/rs6000/float128-hw.c: New file for ISA 3.0 IEEE 128-bit floating point hardware support. * config/rs6000/float128-ifunc.c: New file to pick either IEEE 128-bit floating point software emulation or use ISA 3.0 hardware support if it is available. * config/rs6000/quad-float128.h: New file to support IEEE 128-bit floating point. * config/rs6000/extendkftf2-sw.c: New file, convert IEEE 128-bit floating point to IBM extended double. * config/rs6000/trunctfkf2-sw.c: New file, convert IBM extended double to IEEE 128-bit floating point. * config/rs6000/t-float128: New Makefile fragments to enable building __float128 emulation support. * config/rs6000/t-float128-hw: Likewise. * config/rs6000/sfp-exceptions.c: New file to provide exception support for IEEE 128-bit floating point. * config/rs6000/floattikf.c: New files for converting between IEEE 128-bit floating point and signed/unsigned 128-bit integers. * config/rs6000/fixunskfti.c: Likewise. * config/rs6000/fixkfti.c: Likewise. * config/rs6000/floatuntikf.c: Likewise. * config/rs6000/sfp-machine.h (_FP_W_TYPE_SIZE): Use 64-bit types when building on 64-bit systems, or when VSX is enabled. (_FP_W_TYPE): Likewise. (_FP_WS_TYPE): Likewise. (_FP_I_TYPE): Likewise. (TItype): Define on 64-bit systems. (UTItype): Likewise. (TI_BITS): Likewise. (_FP_MUL_MEAT_D): Add support for using 64-bit types. (_FP_MUL_MEAT_Q): Likewise. (_FP_DIV_MEAT_D): Likewise. (_FP_DIV_MEAT_Q): Likewise. (_FP_NANFRAC_D): Likewise. (_FP_NANFRAC_Q): Likewise. (ISA_BIT): Add exception support if we are being compiled on a machine with hardware floating point support to build the IEEE 128-bit emulation functions. (FP_EX_INVALID): Likewise. (FP_EX_OVERFLOW): Likewise. (FP_EX_UNDERFLOW): Likewise. (FP_EX_DIVZERO): Likewise. (FP_EX_INEXACT): Likewise. (FP_EX_ALL): Likewise. (__sfp_handle_exceptions): Likewise. (FP_HANDLE_EXCEPTIONS): Likewise. (FP_RND_NEAREST): Likewise. (FP_RND_ZERO): Likewise. (FP_RND_PINF): Likewise. (FP_RND_MINF): Likewise. (FP_RND_MASK): Likewise. (_FP_DECL_EX): Likewise. (FP_INIT_ROUNDMODE): Likewise. (FP_ROUNDMODE): Likewise. * libgcc/config.host (powerpc*-*-linux*): If compiler can compile VSX code, enable IEEE 128-bit floating point. If the compiler can compile IEEE 128-bit floating point code with ISA 3.0 IEEE 128-bit floating point hardware instructions and it supports declaring functions with the ifunc attribute, enable ifunc functions to switch between software and hardware support. * configure.ac (powerpc*-*-linux*): Likewise. * configure: Regenerate. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797 Index: libgcc/config/rs6000/float128-sed-hw