I will be submitting 5 patches in this thread to add support for IEEE 128-bit
floating point on the PowerPC.  I have tested this on power7 big endian
systems, power8 big endian systems, and power8 little endian systems, and there
were no regressions.  Ideally, I would like to install this in trunk, and
optionally to the GCC 4.9 and 4.8 branches, depending on the wishes of the
PowerPC maintainer and release managers.

The 5 patches that I will be providing include:
  1) Machine independent patches to libgcc;
  2) PowerPC patches to libgcc to enable IEEE 128-bit floating point;
  3) Machine independent patches to gcc;
  4) PowerPC patches to gcc to enable IEEE 128-bit floating point;
  5) PowerPC tests for IEEE 128-bit floating point.

Obviously, the libgcc patches can't go into until the gcc patches go in.

There are two options to enable IEEE 128-bit floating point:
  1) -mfloat128-vsx: Pass/return IEEE 128-bit FP in vector registers;
  2) -mfloat128-ref: Pass/return IEEE 128-bit FP by reference.

The -mfloat128-ref is intended to use the same calling sequence as the current
compiler uses on systems like Netbsd that have long double as a 128-bit type,
and don't use the IBM extended double format.  The intention here is to not
break these systems, though at present, I have no access to such a system.  I
wanted to leave it as a runtime option rather than a configuration options,
since it has been my experience that configuration options (like SPE, paired
floating point, etc.) are much harder to support.

If you use -mcpu=power7 or -mcpu=power8, it automatically selects
-mfloat128-vsx unless you explicitly use -mfloat128-ref or -mno-float128-vsx.

To use IEEE 128-bit floating point at present, you need to use the __float128
type instead of the long double type.  This is the same as the x86 port uses.
Like the x86 port, the suffix 'q' or 'Q' is used for IEEE 128-bit floating
point constants.

These patches do not address additional support in glibc and gdb that will
likely be needed as well to round out the patches.

Ideally at some time in the future, we will migrate Linux systems so that long
double will be the same as __float128, but these patches do not change the
default behavior.

Are these patches acceptable to be checked into the trunk?

-- 
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

Reply via email to