[OE-core] [OE-Core][PATCH 11/13] gcc: More places to patch to disable ldbl 128 for musl on PPC

Khem Raj raj.khem at gmail.com
Fri Dec 14 23:44:14 UTC 2018


On Fri, Dec 14, 2018 at 9:58 AM Serhey Popovych
<serhe.popovych at gmail.com> wrote:
>
> There are four functions using TFmode type (128bit) that isn't
> available when building with musl. Move each of them from common
> ppc64-fp.c to individual files referenced from t-float128 that used
> when ldbl 128 enabled at configure time.
>
> For gcc-7.3 if -mfloat128 is given -mfloat128-type must be given too.
>
> Exclude ibm-ldouble.c when ldbl 128 isn't enabled at config time.
>
> Build and boot tested with musl (no float128) and glibc (float128
> and ibm128 on PowerPC64).
>

We should be dropping gcc 7 support in master for next release. Gcc 8 one is ok
probably worth submitting it to gcc upstream as well.

> Signed-off-by: Serhey Popovych <serhe.popovych at gmail.com>
> ---
>  ...44-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch | 391 ++++++++++++++++++++-
>  ...34-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch | 342 +++++++++++++++++-
>  2 files changed, 731 insertions(+), 2 deletions(-)
>
> diff --git a/meta/recipes-devtools/gcc/gcc-7.3/0044-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch b/meta/recipes-devtools/gcc/gcc-7.3/0044-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch
> index e39af9b..f4dd891 100644
> --- a/meta/recipes-devtools/gcc/gcc-7.3/0044-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch
> +++ b/meta/recipes-devtools/gcc/gcc-7.3/0044-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch
> @@ -36,14 +36,385 @@ diff --git a/libgcc/config/rs6000/t-linux b/libgcc/config/rs6000/t-linux
>  index 4f6d4c4a4d2..c50dd94a2da 100644
>  --- a/libgcc/config/rs6000/t-linux
>  +++ b/libgcc/config/rs6000/t-linux
> -@@ -1,3 +1,6 @@
> +@@ -1,3 +1,9 @@
>   SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-glibc.ver
>
>  -HOST_LIBGCC2_CFLAGS += -mlong-double-128 -mno-minimal-toc
>  +ifeq ($(with_ldbl128),yes)
>  +HOST_LIBGCC2_CFLAGS += -mlong-double-128
> ++else
> ++# We do not want to build ibm-ldouble.c.
> ++LIB2ADD := $(filter-out %ibm-ldouble.c, $(LIB2ADD))
>  +endif
>  +HOST_LIBGCC2_CFLAGS += -mno-minimal-toc
> +diff --git a/libgcc/config/rs6000/fixtfdi.c b/libgcc/config/rs6000/fixtfdi.c
> +new file mode 100644
> +index 0000000..9b979d0
> +--- /dev/null
> ++++ b/libgcc/config/rs6000/fixtfdi.c
> +@@ -0,0 +1,42 @@
> ++/* Software floating-point emulation.
> ++   Convert a to 64bit signed integer
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "quad-float128.h"
> ++
> ++DItype
> ++__fixtfdi (TFtype a)
> ++{
> ++  if (a < 0)
> ++    return - __fixunstfdi (-a);
> ++  return __fixunstfdi (a);
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/fixunstfdi.c b/libgcc/config/rs6000/fixunstfdi.c
> +new file mode 100644
> +index 0000000..65e9590
> +--- /dev/null
> ++++ b/libgcc/config/rs6000/fixunstfdi.c
> +@@ -0,0 +1,58 @@
> ++/* Software floating-point emulation.
> ++   Convert a to 64bit unsigned integer
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "quad-float128.h"
> ++
> ++DItype
> ++__fixunstfdi (TFtype a)
> ++{
> ++  if (a < 0)
> ++    return 0;
> ++
> ++  /* Compute high word of result, as a flonum.  */
> ++  const TFtype b = (a / (((UDItype) 1) << (sizeof (SItype) * 8)));
> ++  /* Convert that to fixed (but not to DItype!),
> ++     and shift it into the high word.  */
> ++  UDItype v = (USItype) b;
> ++  v <<= (sizeof (SItype) * 8);
> ++  /* Remove high part from the TFtype, leaving the low part as flonum.  */
> ++  a -= (TFtype) v;
> ++  /* Convert that to fixed (but not to DItype!) and add it in.
> ++     Sometimes A comes out negative.  This is significant, since
> ++     A has more bits than a long int does.  */
> ++  if (a < 0)
> ++    v -= (USItype) (-a);
> ++  else
> ++    v += (USItype) a;
> ++  return v;
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/floatditf.c b/libgcc/config/rs6000/floatditf.c
> +new file mode 100644
> +index 0000000..20ad4c6
> +--- /dev/null
> ++++ b/libgcc/config/rs6000/floatditf.c
> +@@ -0,0 +1,47 @@
> ++/* Software floating-point emulation.
> ++   Convert a 64bit signed integer to IEEE quad
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "double.h"
> ++#include "quad-float128.h"
> ++
> ++TFtype
> ++__floatditf (DItype u)
> ++{
> ++  DFtype dh, dl;
> ++
> ++  dh = (SItype) (u >> (sizeof (SItype) * 8));
> ++  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> ++  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> ++
> ++  return (TFtype) dh + (TFtype) dl;
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/floatunditf.c b/libgcc/config/rs6000/floatunditf.c
> +new file mode 100644
> +index 0000000..23dbde2
> +--- /dev/null
> ++++ b/libgcc/config/rs6000/floatunditf.c
> +@@ -0,0 +1,47 @@
> ++/* Software floating-point emulation.
> ++   Convert a 64bit unsigned integer to IEEE quad
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "double.h"
> ++#include "quad-float128.h"
> ++
> ++TFtype
> ++__floatunditf (UDItype u)
> ++{
> ++  DFtype dh, dl;
> ++
> ++  dh = (USItype) (u >> (sizeof (SItype) * 8));
> ++  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> ++  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> ++
> ++  return (TFtype) dh + (TFtype) dl;
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/ppc64-fp.c b/libgcc/config/rs6000/ppc64-fp.c
> +index 5e1cbdd..70ad3c9 100644
> +--- a/libgcc/config/rs6000/ppc64-fp.c
> ++++ b/libgcc/config/rs6000/ppc64-fp.c
> +@@ -25,33 +25,20 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> + <http://www.gnu.org/licenses/>.  */
> +
> + #if defined(__powerpc64__) || defined (__64BIT__) || defined(__ppc64__)
> +-#define TMODES
> + #include "fp-bit.h"
> +
> +-extern DItype __fixtfdi (TFtype);
> + extern DItype __fixdfdi (DFtype);
> + extern DItype __fixsfdi (SFtype);
> + extern USItype __fixunsdfsi (DFtype);
> + extern USItype __fixunssfsi (SFtype);
> +-extern TFtype __floatditf (DItype);
> +-extern TFtype __floatunditf (UDItype);
> + extern DFtype __floatdidf (DItype);
> + extern DFtype __floatundidf (UDItype);
> + extern SFtype __floatdisf (DItype);
> + extern SFtype __floatundisf (UDItype);
> +-extern DItype __fixunstfdi (TFtype);
> +
> + static DItype local_fixunssfdi (SFtype);
> + static DItype local_fixunsdfdi (DFtype);
> +
> +-DItype
> +-__fixtfdi (TFtype a)
> +-{
> +-  if (a < 0)
> +-    return - __fixunstfdi (-a);
> +-  return __fixunstfdi (a);
> +-}
> +-
> + DItype
> + __fixdfdi (DFtype a)
> + {
> +@@ -86,30 +73,6 @@ __fixunssfsi (SFtype a)
> +   return (SItype) a;
> + }
> +
> +-TFtype
> +-__floatditf (DItype u)
> +-{
> +-  DFtype dh, dl;
> +-
> +-  dh = (SItype) (u >> (sizeof (SItype) * 8));
> +-  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> +-  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> +-
> +-  return (TFtype) dh + (TFtype) dl;
> +-}
> +-
> +-TFtype
> +-__floatunditf (UDItype u)
> +-{
> +-  DFtype dh, dl;
> +-
> +-  dh = (USItype) (u >> (sizeof (SItype) * 8));
> +-  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> +-  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> +-
> +-  return (TFtype) dh + (TFtype) dl;
> +-}
> +-
> + DFtype
> + __floatdidf (DItype u)
> + {
> +@@ -183,30 +146,6 @@ __floatundisf (UDItype u)
> +   return (SFtype) f;
> + }
> +
> +-DItype
> +-__fixunstfdi (TFtype a)
> +-{
> +-  if (a < 0)
> +-    return 0;
> +-
> +-  /* Compute high word of result, as a flonum.  */
> +-  const TFtype b = (a / (((UDItype) 1) << (sizeof (SItype) * 8)));
> +-  /* Convert that to fixed (but not to DItype!),
> +-     and shift it into the high word.  */
> +-  UDItype v = (USItype) b;
> +-  v <<= (sizeof (SItype) * 8);
> +-  /* Remove high part from the TFtype, leaving the low part as flonum.  */
> +-  a -= (TFtype) v;
> +-  /* Convert that to fixed (but not to DItype!) and add it in.
> +-     Sometimes A comes out negative.  This is significant, since
> +-     A has more bits than a long int does.  */
> +-  if (a < 0)
> +-    v -= (USItype) (-a);
> +-  else
> +-    v += (USItype) a;
> +-  return v;
> +-}
> +-
> + /* This version is needed to prevent recursion; fixunsdfdi in libgcc
> +    calls fixdfdi, which in turn calls calls fixunsdfdi.  */
> +
> +diff --git a/libgcc/config/rs6000/quad-float128.h b/libgcc/config/rs6000/quad-float128.h
> +index 7d69c87..a0c2664 100644
> +--- a/libgcc/config/rs6000/quad-float128.h
> ++++ b/libgcc/config/rs6000/quad-float128.h
> +@@ -99,6 +99,11 @@ extern TItype_ppc __fixkfti (TFtype);
> + extern UTItype_ppc __fixunskfti (TFtype);
> + extern TFtype __floattikf (TItype_ppc);
> + extern TFtype __floatuntikf (UTItype_ppc);
> ++
> ++extern DItype_ppc __fixtfdi (TFtype);
> ++extern DItype_ppc __fixunstfdi (TFtype);
> ++extern TFtype __floatditf (DItype_ppc);
> ++extern TFtype __floatunditf (UDItype_ppc);
> + #endif
> +
> + /* Functions using the ISA 3.0 hardware support.  If the code is compiled with
> +diff --git a/libgcc/config/rs6000/t-float128 b/libgcc/config/rs6000/t-float128
> +index 2c52ca6..3a241aa 100644
> +--- a/libgcc/config/rs6000/t-float128
> ++++ b/libgcc/config/rs6000/t-float128
> +@@ -24,6 +24,7 @@ fp128_softfp_obj     = $(fp128_softfp_static_obj) $(fp128_softfp_shared_obj)
> +
> + # New functions for software emulation
> + fp128_ppc_funcs               = floattikf floatuntikf fixkfti fixunskfti \
> ++                        floatditf floatunditf fixtfdi fixunstfdi \
> +                         extendkftf2-sw trunctfkf2-sw \
> +                         sfp-exceptions _mulkc3 _divkc3
> +
> +@@ -58,7 +59,7 @@ fp128_includes               = $(srcdir)/soft-fp/double.h \
> +                         $(srcdir)/soft-fp/soft-fp.h
> +
> + # Build the emulator without ISA 3.0 hardware support.
> +-FP128_CFLAGS_SW                = -Wno-type-limits -mvsx -mfloat128 \
> ++FP128_CFLAGS_SW                = -Wno-type-limits -mvsx -mfloat128 -mfloat128-type \
> +                          -mno-float128-hardware \
> +                          -I$(srcdir)/soft-fp \
> +                          -I$(srcdir)/config/rs6000 \
> +diff --git a/libgcc/config/rs6000/t-float128-hw b/libgcc/config/rs6000/t-float128-hw
> +index 161062f..0476874 100644
> +--- a/libgcc/config/rs6000/t-float128-hw
> ++++ b/libgcc/config/rs6000/t-float128-hw
> +@@ -21,7 +21,7 @@ fp128_ifunc_obj              = $(fp128_ifunc_static_obj) $(fp128_ifunc_shared_obj)
> + fp128_sed_hw          = -hw
> +
> + # Build the hardware support functions with appropriate hardware support
> +-FP128_CFLAGS_HW                = -Wno-type-limits -mvsx -mfloat128 \
> ++FP128_CFLAGS_HW                = -Wno-type-limits -mvsx -mfloat128 -mfloat128-type \
> +                          -mpower8-vector -mpower9-vector \
> +                          -mfloat128-hardware \
> +                          -I$(srcdir)/soft-fp \
>  diff --git a/libgcc/configure b/libgcc/configure
>  old mode 100644
>  new mode 100755
> @@ -96,6 +467,15 @@ index 45c459788c3..e2d19b144b8
>   # Check whether --with-aix-soname was given.
>   if test "${with_aix_soname+set}" = set; then :
>     withval=$with_aix_soname; case "${host}:${enable_shared}" in
> +@@ -4999,7 +4999,7 @@ case ${host} in
> + # for hardware support.
> + powerpc*-*-linux*)
> +   saved_CFLAGS="$CFLAGS"
> +-  CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128"
> ++  CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128 -mfloat128-type"
> +   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PowerPC ISA 2.06 to build __float128 libraries" >&5
> + $as_echo_n "checking for PowerPC ISA 2.06 to build __float128 libraries... " >&6; }
> + if test "${libgcc_cv_powerpc_float128+set}" = set; then :
>  diff --git a/libgcc/configure.ac b/libgcc/configure.ac
>  index af151473709..dada52416da 100644
>  --- a/libgcc/configure.ac
> @@ -119,6 +499,15 @@ index af151473709..dada52416da 100644
>   AC_ARG_WITH(aix-soname,
>   [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
>       [shared library versioning (aka "SONAME") variant to provide on AIX])],
> +@@ -394,7 +394,7 @@ case ${host} in
> + # for hardware support.
> + powerpc*-*-linux*)
> +   saved_CFLAGS="$CFLAGS"
> +-  CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128"
> ++  CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128 -mfloat128-type"
> +   AC_CACHE_CHECK([for PowerPC ISA 2.06 to build __float128 libraries],
> +                [libgcc_cv_powerpc_float128],
> +                [AC_COMPILE_IFELSE(
>  --
>  2.12.2
>
> diff --git a/meta/recipes-devtools/gcc/gcc-8.2/0034-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch b/meta/recipes-devtools/gcc/gcc-8.2/0034-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch
> index 7a69ea2..391cda7 100644
> --- a/meta/recipes-devtools/gcc/gcc-8.2/0034-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch
> +++ b/meta/recipes-devtools/gcc/gcc-8.2/0034-libgcc-Add-knob-to-use-ldbl-128-on-ppc.patch
> @@ -37,14 +37,354 @@ diff --git a/libgcc/config/rs6000/t-linux b/libgcc/config/rs6000/t-linux
>  index 4f6d4c4a4d2..c50dd94a2da 100644
>  --- a/libgcc/config/rs6000/t-linux
>  +++ b/libgcc/config/rs6000/t-linux
> -@@ -1,3 +1,6 @@
> +@@ -1,3 +1,9 @@
>   SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-glibc.ver
>
>  -HOST_LIBGCC2_CFLAGS += -mlong-double-128 -mno-minimal-toc
>  +ifeq ($(with_ldbl128),yes)
>  +HOST_LIBGCC2_CFLAGS += -mlong-double-128
> ++else
> ++# We do not want to build ibm-ldouble.c.
> ++LIB2ADD := $(filter-out %ibm-ldouble.c, $(LIB2ADD))
>  +endif
>  +HOST_LIBGCC2_CFLAGS += -mno-minimal-toc
> +diff --git a/libgcc/config/rs6000/fixtfdi.c b/libgcc/config/rs6000/fixtfdi.c
> +--- a/libgcc/config/rs6000/fixtfdi.c   1969-12-31 19:00:00.000000000 -0500
> ++++ b/libgcc/config/rs6000/fixtfdi.c   2018-12-12 17:54:50.110755540 -0500
> +@@ -0,0 +1,42 @@
> ++/* Software floating-point emulation.
> ++   Convert a to 64bit signed integer
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "quad-float128.h"
> ++
> ++DItype
> ++__fixtfdi (TFtype a)
> ++{
> ++  if (a < 0)
> ++    return - __fixunstfdi (-a);
> ++  return __fixunstfdi (a);
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/fixunstfdi.c b/libgcc/config/rs6000/fixunstfdi.c
> +--- a/libgcc/config/rs6000/fixunstfdi.c        1969-12-31 19:00:00.000000000 -0500
> ++++ b/libgcc/config/rs6000/fixunstfdi.c        2018-12-12 17:56:06.141654537 -0500
> +@@ -0,0 +1,58 @@
> ++/* Software floating-point emulation.
> ++   Convert a to 64bit unsigned integer
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "quad-float128.h"
> ++
> ++DItype
> ++__fixunstfdi (TFtype a)
> ++{
> ++  if (a < 0)
> ++    return 0;
> ++
> ++  /* Compute high word of result, as a flonum.  */
> ++  const TFtype b = (a / (((UDItype) 1) << (sizeof (SItype) * 8)));
> ++  /* Convert that to fixed (but not to DItype!),
> ++     and shift it into the high word.  */
> ++  UDItype v = (USItype) b;
> ++  v <<= (sizeof (SItype) * 8);
> ++  /* Remove high part from the TFtype, leaving the low part as flonum.  */
> ++  a -= (TFtype) v;
> ++  /* Convert that to fixed (but not to DItype!) and add it in.
> ++     Sometimes A comes out negative.  This is significant, since
> ++     A has more bits than a long int does.  */
> ++  if (a < 0)
> ++    v -= (USItype) (-a);
> ++  else
> ++    v += (USItype) a;
> ++  return v;
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/floatditf.c b/libgcc/config/rs6000/floatditf.c
> +--- a/libgcc/config/rs6000/floatditf.c 1969-12-31 19:00:00.000000000 -0500
> ++++ b/libgcc/config/rs6000/floatditf.c 2018-12-12 17:57:55.852953553 -0500
> +@@ -0,0 +1,47 @@
> ++/* Software floating-point emulation.
> ++   Convert a 64bit signed integer to IEEE quad
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "double.h"
> ++#include "quad-float128.h"
> ++
> ++TFtype
> ++__floatditf (DItype u)
> ++{
> ++  DFtype dh, dl;
> ++
> ++  dh = (SItype) (u >> (sizeof (SItype) * 8));
> ++  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> ++  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> ++
> ++  return (TFtype) dh + (TFtype) dl;
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/floatunditf.c b/libgcc/config/rs6000/floatunditf.c
> +--- a/libgcc/config/rs6000/floatunditf.c       1969-12-31 19:00:00.000000000 -0500
> ++++ b/libgcc/config/rs6000/floatunditf.c       2018-12-12 17:57:15.262473574 -0500
> +@@ -0,0 +1,47 @@
> ++/* Software floating-point emulation.
> ++   Convert a 64bit unsigned integer to IEEE quad
> ++   Copyright (C) 1997-2016 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Richard Henderson (rth at cygnus.com) and
> ++                Jakub Jelinek (jj at ultra.linux.cz).
> ++
> ++   The GNU C Library is free software; you can redistribute it and/or
> ++   modify it under the terms of the GNU Lesser General Public
> ++   License as published by the Free Software Foundation; either
> ++   version 2.1 of the License, or (at your option) any later version.
> ++
> ++   In addition to the permissions in the GNU Lesser General Public
> ++   License, the Free Software Foundation gives you unlimited
> ++   permission to link the compiled version of this file into
> ++   combinations with other programs, and to distribute those
> ++   combinations without any restriction coming from the use of this
> ++   file.  (The Lesser General Public License restrictions do apply in
> ++   other respects; for example, they cover modification of the file,
> ++   and distribution when not linked into a combine executable.)
> ++
> ++   The GNU C Library is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++   Lesser General Public License for more details.
> ++
> ++   You should have received a copy of the GNU Lesser General Public
> ++   License along with the GNU C Library; if not, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifdef _ARCH_PPC64
> ++#include "soft-fp.h"
> ++#include "double.h"
> ++#include "quad-float128.h"
> ++
> ++TFtype
> ++__floatunditf (UDItype u)
> ++{
> ++  DFtype dh, dl;
> ++
> ++  dh = (USItype) (u >> (sizeof (SItype) * 8));
> ++  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> ++  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> ++
> ++  return (TFtype) dh + (TFtype) dl;
> ++}
> ++#endif
> +diff --git a/libgcc/config/rs6000/ppc64-fp.c b/libgcc/config/rs6000/ppc64-fp.c
> +--- a/libgcc/config/rs6000/ppc64-fp.c  2018-12-12 17:53:49.540038500 -0500
> ++++ b/libgcc/config/rs6000/ppc64-fp.c  2018-12-12 17:49:51.897235314 -0500
> +@@ -25,34 +25,21 @@
> + <http://www.gnu.org/licenses/>.  */
> +
> + #if defined(__powerpc64__) || defined (__64BIT__) || defined(__ppc64__)
> +-#define TMODES
> + #include "fp-bit.h"
> +
> +-extern DItype __fixtfdi (TFtype);
> + extern DItype __fixdfdi (DFtype);
> + extern DItype __fixsfdi (SFtype);
> + extern USItype __fixunsdfsi (DFtype);
> + extern USItype __fixunssfsi (SFtype);
> +-extern TFtype __floatditf (DItype);
> +-extern TFtype __floatunditf (UDItype);
> + extern DFtype __floatdidf (DItype);
> + extern DFtype __floatundidf (UDItype);
> + extern SFtype __floatdisf (DItype);
> + extern SFtype __floatundisf (UDItype);
> +-extern DItype __fixunstfdi (TFtype);
> +
> + static DItype local_fixunssfdi (SFtype);
> + static DItype local_fixunsdfdi (DFtype);
> +
> + DItype
> +-__fixtfdi (TFtype a)
> +-{
> +-  if (a < 0)
> +-    return - __fixunstfdi (-a);
> +-  return __fixunstfdi (a);
> +-}
> +-
> +-DItype
> + __fixdfdi (DFtype a)
> + {
> +   if (a < 0)
> +@@ -86,30 +73,6 @@
> +   return (SItype) a;
> + }
> +
> +-TFtype
> +-__floatditf (DItype u)
> +-{
> +-  DFtype dh, dl;
> +-
> +-  dh = (SItype) (u >> (sizeof (SItype) * 8));
> +-  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> +-  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> +-
> +-  return (TFtype) dh + (TFtype) dl;
> +-}
> +-
> +-TFtype
> +-__floatunditf (UDItype u)
> +-{
> +-  DFtype dh, dl;
> +-
> +-  dh = (USItype) (u >> (sizeof (SItype) * 8));
> +-  dh *= 2.0 * (((UDItype) 1) << ((sizeof (SItype) * 8) - 1));
> +-  dl = (USItype) (u & ((((UDItype) 1) << (sizeof (SItype) * 8)) - 1));
> +-
> +-  return (TFtype) dh + (TFtype) dl;
> +-}
> +-
> + DFtype
> + __floatdidf (DItype u)
> + {
> +@@ -183,30 +146,6 @@
> +   return (SFtype) f;
> + }
> +
> +-DItype
> +-__fixunstfdi (TFtype a)
> +-{
> +-  if (a < 0)
> +-    return 0;
> +-
> +-  /* Compute high word of result, as a flonum.  */
> +-  const TFtype b = (a / (((UDItype) 1) << (sizeof (SItype) * 8)));
> +-  /* Convert that to fixed (but not to DItype!),
> +-     and shift it into the high word.  */
> +-  UDItype v = (USItype) b;
> +-  v <<= (sizeof (SItype) * 8);
> +-  /* Remove high part from the TFtype, leaving the low part as flonum.  */
> +-  a -= (TFtype) v;
> +-  /* Convert that to fixed (but not to DItype!) and add it in.
> +-     Sometimes A comes out negative.  This is significant, since
> +-     A has more bits than a long int does.  */
> +-  if (a < 0)
> +-    v -= (USItype) (-a);
> +-  else
> +-    v += (USItype) a;
> +-  return v;
> +-}
> +-
> + /* This version is needed to prevent recursion; fixunsdfdi in libgcc
> +    calls fixdfdi, which in turn calls calls fixunsdfdi.  */
> +
> +diff --git a/libgcc/config/rs6000/quad-float128.h b/libgcc/config/rs6000/quad-float128.h
> +--- a/libgcc/config/rs6000/quad-float128.h     2018-12-12 17:53:49.540038500 -0500
> ++++ b/libgcc/config/rs6000/quad-float128.h     2018-12-12 17:30:19.423468244 -0500
> +@@ -104,6 +104,11 @@
> + extern UTItype_ppc __fixunskfti (TFtype);
> + extern TFtype __floattikf (TItype_ppc);
> + extern TFtype __floatuntikf (UTItype_ppc);
> ++
> ++extern DItype_ppc __fixtfdi (TFtype);
> ++extern DItype_ppc __fixunstfdi (TFtype);
> ++extern TFtype __floatditf (DItype_ppc);
> ++extern TFtype __floatunditf (UDItype_ppc);
> + #endif
> +
> + /* Functions using the ISA 3.0 hardware support.  If the code is compiled with
> +diff --git a/libgcc/config/rs6000/t-float128 b/libgcc/config/rs6000/t-float128
> +--- a/libgcc/config/rs6000/t-float128  2018-12-12 17:53:49.540038500 -0500
> ++++ b/libgcc/config/rs6000/t-float128  2018-12-12 17:45:12.233937136 -0500
> +@@ -24,6 +24,7 @@
> +
> + # New functions for software emulation
> + fp128_ppc_funcs               = floattikf floatuntikf fixkfti fixunskfti \
> ++                        floatditf floatunditf fixtfdi fixunstfdi \
> +                         extendkftf2-sw trunctfkf2-sw \
> +                         sfp-exceptions _mulkc3 _divkc3 _powikf2
> +
> +
>  diff --git a/libgcc/configure b/libgcc/configure
>  old mode 100644
>  new mode 100755
> --
> 2.7.4
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core


More information about the Openembedded-core mailing list