Thank you!

Are all parts with `#if defined __powerpc__` 32-bit specific? If yes, then
`__ppc__` will do. If no, then we either need to add also `__ppc64__` or
use `__POWERPC__` instead (which includes both 32- and 64-bit Darwin).

On Thu, Oct 30, 2025 at 5:27 AM Bruno Haible <[email protected]> wrote:

> Sergey Fedorov wrote:
> > That macro indeed seems to be defined:
> > ```
> > $ gcc -arch ppc -E -dM - < /dev/null | grep -i '\(ppc\|powerpc\)' | sort
> > #define _ARCH_PPC 1
> > #define _ARCH_PPCGR 1
> > #define __POWERPC__ 1
> > #define __ppc__ 1
> > ```
> > And for gcc14:
> > ```
> > $ /opt/local/bin/gcc-mp-14 -arch ppc -E -dM - < /dev/null | grep -i
> > '\(ppc\|powerpc\)' | sort
> > #define PPC 1
> > #define _ARCH_PPC 1
> > #define _ARCH_PPCGR 1
> > #define __POWERPC__ 1
> > #define __PPC 1
> > #define __PPC__ 1
> > #define __ppc__ 1
> > ```
>
> Good. So, we have the choice among
>   - _ARCH_PPC (which is also defined on AIX),
>   - __POWERPC__
>   - __ppc__
>
> Since __ppc__ is already being tested in other code (such as
> tests/test-frexpl.c), I'm going with that one.
>
> Alternatively, one could add a dependency to module 'host-cpu-c-abi'.
> But I think that would be overkill here.
>
>
> 2025-10-29  Bruno Haible  <[email protected]>
>
>         Fix support for Mac OS X/PowerPC.
>         Reported by Sergey Fedorov <[email protected]> in
>         <
> https://lists.gnu.org/archive/html/bug-gnulib/2025-10/msg00097.html>.
>         * lib/fenv.in.h: Whenever we test __powerpc__ and the OS could be
>         Mac OS X, test also __ppc__.
>         * lib/fenv-private.h: Likewise.
>         * lib/fenv-env.c: Likewise.
>         * lib/fenv-except-state-get.c: Likewise.
>         * lib/fenv-except-state-set.c: Likewise.
>         * lib/fenv-except-state-test.c: Likewise.
>         * lib/fenv-except-tracking-clear.c: Likewise.
>         * lib/fenv-except-tracking-raise.c: Likewise.
>         * lib/fenv-except-tracking-set.c: Likewise.
>         * lib/fenv-except-tracking-test.c: Likewise.
>         * lib/fenv-except-trapping.c: Likewise.
>         * lib/fenv-round.c: Likewise.
>         * lib/float.in.h: Likewise.
>         * lib/snan.h: Likewise.
>         * m4/isfinite.m4 (gl_ISFINITEL_WORKS): Likewise.
>         * tests/qemu.h: Likewise.
>         * tests/test-fenv-except-state-3.c: Likewise.
>         * tests/test-fenv-except-tracking-5.c: Likewise.
>         * tests/test-getpayloadl.c: Likewise.
>         * tests/test-setpayloadl.c: Likewise.
>         * tests/test-setpayloadsigl.c: Likewise.
>
> diff --git a/lib/fenv-env.c b/lib/fenv-env.c
> index 637bc3e8c8..cba1fa9e92 100644
> --- a/lib/fenv-env.c
> +++ b/lib/fenv-env.c
> @@ -813,7 +813,7 @@ fesetenv (fenv_t const *envp)
>    return 0;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  /* On all OSes except *BSD and AIX, fenv_t is a 'double'.
>     On *BSD, it's an 'unsigned int'.
> diff --git a/lib/fenv-except-state-get.c b/lib/fenv-except-state-get.c
> index 9f2c695386..cc27ebc744 100644
> --- a/lib/fenv-except-state-get.c
> +++ b/lib/fenv-except-state-get.c
> @@ -192,7 +192,7 @@ fegetexceptflag (fexcept_t *saved_flags, int
> exceptions)
>    return 0;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  /* On all OSes, fexcept_t is binary-equivalent to an 'unsigned int'.  */
>
> diff --git a/lib/fenv-except-state-set.c b/lib/fenv-except-state-set.c
> index 2b7fb1a9ff..7ec74a3cfe 100644
> --- a/lib/fenv-except-state-set.c
> +++ b/lib/fenv-except-state-set.c
> @@ -268,7 +268,7 @@ fesetexceptflag (fexcept_t const *saved_flags, int
> exceptions)
>    return 0;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  /* On all OSes, fexcept_t is binary-equivalent to an 'unsigned int'.  */
>
> diff --git a/lib/fenv-except-state-test.c b/lib/fenv-except-state-test.c
> index 92d9d863b4..9dc61d08b6 100644
> --- a/lib/fenv-except-state-test.c
> +++ b/lib/fenv-except-state-test.c
> @@ -103,7 +103,7 @@ fetestexceptflag (fexcept_t const *saved_flags, int
> exceptions)
>    return flags & FE_ALL_EXCEPT & exceptions;
>  }
>
> -#elif defined __powerpc__
> +#elif (defined __ppc__ || defined __powerpc__)
>
>  int
>  fetestexceptflag (fexcept_t const *saved_flags, int exceptions)
> diff --git a/lib/fenv-except-tracking-clear.c
> b/lib/fenv-except-tracking-clear.c
> index 7da0fcd6e9..0b20c23c59 100644
> --- a/lib/fenv-except-tracking-clear.c
> +++ b/lib/fenv-except-tracking-clear.c
> @@ -211,7 +211,7 @@ feclearexcept (int exceptions)
>    return 0;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  int
>  feclearexcept (int exceptions)
> diff --git a/lib/fenv-except-tracking-raise.c
> b/lib/fenv-except-tracking-raise.c
> index 12550ac976..0df878fe45 100644
> --- a/lib/fenv-except-tracking-raise.c
> +++ b/lib/fenv-except-tracking-raise.c
> @@ -314,7 +314,7 @@ feraiseexcept (int exceptions)
>    return 0;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  int
>  feraiseexcept (int exceptions)
> diff --git a/lib/fenv-except-tracking-set.c
> b/lib/fenv-except-tracking-set.c
> index c251814884..f56b813489 100644
> --- a/lib/fenv-except-tracking-set.c
> +++ b/lib/fenv-except-tracking-set.c
> @@ -228,7 +228,7 @@ fesetexcept (int exceptions)
>    return 0;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  int
>  fesetexcept (int exceptions)
> diff --git a/lib/fenv-except-tracking-test.c
> b/lib/fenv-except-tracking-test.c
> index b9dd07fdee..baa65de450 100644
> --- a/lib/fenv-except-tracking-test.c
> +++ b/lib/fenv-except-tracking-test.c
> @@ -158,7 +158,7 @@ fetestexcept (int exceptions)
>    return fcsr & FE_ALL_EXCEPT & exceptions;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  int
>  fetestexcept (int exceptions)
> diff --git a/lib/fenv-except-trapping.c b/lib/fenv-except-trapping.c
> index 8ccdbe34ac..82c50ca394 100644
> --- a/lib/fenv-except-trapping.c
> +++ b/lib/fenv-except-trapping.c
> @@ -487,7 +487,7 @@ fegetexcept (void)
>    return FE_ALL_EXCEPT & (fcsr << 16);
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  #  if defined __linux__
>  #   include <sys/prctl.h>
> diff --git a/lib/fenv-private.h b/lib/fenv-private.h
> index 772d8dce9d..5e44975ae6 100644
> --- a/lib/fenv-private.h
> +++ b/lib/fenv-private.h
> @@ -278,7 +278,7 @@ extern void __ieee_set_fp_control (unsigned long);
>  # define _FPU_GETCW(cw) __asm__ __volatile__ ("movfcsr2gr %0,$r0" : "=r"
> (cw))
>  # define _FPU_SETCW(cw) __asm__ __volatile__ ("movgr2fcsr $r0,%0" : : "r"
> (cw))
>
> -#elif defined __powerpc__
> +#elif (defined __ppc__ || defined __powerpc__)
>
>  /* fpscr bits 28..25 indicate which floating-point exceptions, other than
>     FE_INVALID, have occurred since the respective bit was last set to
> zero.
> diff --git a/lib/fenv-round.c b/lib/fenv-round.c
> index 3db8ba8ec1..ff76713418 100644
> --- a/lib/fenv-round.c
> +++ b/lib/fenv-round.c
> @@ -315,7 +315,7 @@ fesetround (int rounding_direction)
>    return 0;
>  }
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  /* The AIX header files have different values for the rounding directions
>     than all the other platforms: The values 0 and 1 are swapped.
> diff --git a/lib/fenv.in.h b/lib/fenv.in.h
> index 887ec57130..7f71ab5b9c 100644
> --- a/lib/fenv.in.h
> +++ b/lib/fenv.in.h
> @@ -125,7 +125,7 @@ typedef struct
>    }
>  fenv_t;
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  typedef double /* yuck! */ fenv_t; /* fpscr register */
>
> @@ -328,7 +328,7 @@ _GL_CXXALIASWARN (feholdexcept);
>  #  define FE_UPWARD      (2 << 8)
>  #  define FE_DOWNWARD    (3 << 8)
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  /* Attention: AIX has different values for these macros!  */
>  #  define FE_TONEAREST   0
> @@ -497,7 +497,7 @@ _GL_CXXALIASWARN (fesetround);
>  #  define FE_DIVBYZERO  (1U << 19)
>  #  define FE_INVALID    (1U << 20)
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  #  define FE_INEXACT    (1U << 25)
>  #  define FE_DIVBYZERO  (1U << 26)
> @@ -764,7 +764,7 @@ typedef unsigned short fexcept_t;
>
>  typedef unsigned int fexcept_t;
>
> -# elif defined __powerpc__
> +# elif (defined __ppc__ || defined __powerpc__)
>
>  typedef unsigned int fexcept_t;
>
> diff --git a/lib/float.in.h b/lib/float.in.h
> index 3093f9a01d..c3f89b8b36 100644
> --- a/lib/float.in.h
> +++ b/lib/float.in.h
> @@ -119,7 +119,7 @@ extern const union gl_long_double_union gl_LDBL_MAX;
>     wrong.
>     Assume these bugs are fixed in any GCC new enough
>     to define __LDBL_NORM_MAX__.  */
> -#if (defined __powerpc__ && LDBL_MANT_DIG == 106 \
> +#if ((defined __ppc__ || defined __powerpc__) && LDBL_MANT_DIG == 106 \
>       && defined __GNUC__ && !defined __LDBL_NORM_MAX__)
>  # undef LDBL_MIN_EXP
>  # define LDBL_MIN_EXP (-968)
> diff --git a/lib/snan.h b/lib/snan.h
> index 2d955abc7f..635201fa49 100644
> --- a/lib/snan.h
> +++ b/lib/snan.h
> @@ -216,7 +216,7 @@ construct_memory_SNaNl (long double quiet_value)
>  {
>    memory_long_double m;
>    m.value = quiet_value;
> -  #if defined __powerpc__ && LDBL_MANT_DIG == 106
> +  #if (defined __ppc__ || defined __powerpc__) && LDBL_MANT_DIG == 106
>      /* This is PowerPC "double double", a pair of two doubles.  Inf and
> NaN are
>         represented as the corresponding 64-bit IEEE values in the first
> double;
>         the second is ignored.  Manipulate only the first double.  */
> diff --git a/m4/isfinite.m4 b/m4/isfinite.m4
> index af3cf73ca6..56abe8f49e 100644
> --- a/m4/isfinite.m4
> +++ b/m4/isfinite.m4
> @@ -1,5 +1,5 @@
>  # isfinite.m4
> -# serial 21
> +# serial 22
>  dnl Copyright (C) 2007-2025 Free Software Foundation, Inc.
>  dnl This file is free software; the Free Software Foundation
>  dnl gives unlimited permission to copy and/or distribute it,
> @@ -84,7 +84,7 @@ AC_DEFUN([gl_ISFINITEL_WORKS]
>  #if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
>      /* Another NaN, more precisely crafted.  */
>      m.value = NaNl ();
> -    #if defined __powerpc__ && LDBL_MANT_DIG == 106
> +    #if (defined __ppc__ || defined __powerpc__) && LDBL_MANT_DIG == 106
>        /* This is PowerPC "double double", a pair of two doubles.  Inf and
> NaN are
>           represented as the corresponding 64-bit IEEE values in the first
> double;
>           the second is ignored.  Manipulate only the first double.  */
> diff --git a/tests/qemu.h b/tests/qemu.h
> index 88dbfbf38e..6188f796ee 100644
> --- a/tests/qemu.h
> +++ b/tests/qemu.h
> @@ -83,7 +83,7 @@ is_running_under_qemu_user (void)
>            if (strcasestr (buf, "SPARC") != NULL)
>              return true;
>  # endif
> -# if !defined __powerpc__
> +# if !(defined __ppc__ || defined __powerpc__)
>            if (strstr (buf, "POWER") != NULL)
>              return true;
>  # endif
> diff --git a/tests/test-fenv-except-state-3.c
> b/tests/test-fenv-except-state-3.c
> index c00bdff209..992f1f9123 100644
> --- a/tests/test-fenv-except-state-3.c
> +++ b/tests/test-fenv-except-state-3.c
> @@ -71,7 +71,7 @@ main ()
>    /* On older i386 and on PowerPC, there is no way to implement
>       fesetexceptflag() such that it does not trigger a trap.
> fesetexceptflag()
>       is expected to fail in this case.  */
> -# if !((defined __i386 || defined _M_IX86) || defined __powerpc__)
> +# if !((defined __i386 || defined _M_IX86) || (defined __ppc__ || defined
> __powerpc__))
>    ASSERT (rc == 0);
>  # endif
>
> diff --git a/tests/test-fenv-except-tracking-5.c
> b/tests/test-fenv-except-tracking-5.c
> index cb834e0dcb..df9a989d35 100644
> --- a/tests/test-fenv-except-tracking-5.c
> +++ b/tests/test-fenv-except-tracking-5.c
> @@ -55,7 +55,7 @@ main ()
>    /* On older i386 and on PowerPC, there is no way to implement
>       fesetexcept() such that it does not trigger a trap.  fesetexcept()
>       is expected to fail in this case.  */
> -# if !((defined __i386 || defined _M_IX86) || defined __powerpc__)
> +# if !((defined __i386 || defined _M_IX86) || (defined __ppc__ || defined
> __powerpc__))
>    ASSERT (rc == 0);
>  # endif
>
> diff --git a/tests/test-getpayloadl.c b/tests/test-getpayloadl.c
> index 6fd6f6fbe4..6c83a18d1a 100644
> --- a/tests/test-getpayloadl.c
> +++ b/tests/test-getpayloadl.c
> @@ -28,7 +28,7 @@ SIGNATURE_CHECK (getpayloadl, long double, (const long
> double *));
>  #include "signed-snan.h"
>  #include "macros.h"
>
> -#if defined __powerpc__ && LDBL_MANT_DIG == 106
> +#if (defined __ppc__ || defined __powerpc__) && LDBL_MANT_DIG == 106
>    /* This is PowerPC "double double", a pair of two doubles.  NaN is
> represented
>       as the corresponding 64-bit IEEE value in the first double; the
> second is
>       irrelevant and therefore does not contain a payload.  */
> diff --git a/tests/test-setpayloadl.c b/tests/test-setpayloadl.c
> index b1ab041c50..bd990f2852 100644
> --- a/tests/test-setpayloadl.c
> +++ b/tests/test-setpayloadl.c
> @@ -28,7 +28,7 @@ SIGNATURE_CHECK (setpayloadl, int, (long double *, long
> double));
>  #include "isnanl-nolibm.h"
>  #include "macros.h"
>
> -#if defined __powerpc__ && LDBL_MANT_DIG == 106
> +#if (defined __ppc__ || defined __powerpc__) && LDBL_MANT_DIG == 106
>    /* This is PowerPC "double double", a pair of two doubles.  NaN is
> represented
>       as the corresponding 64-bit IEEE value in the first double; the
> second is
>       irrelevant and therefore does not contain a payload.  */
> diff --git a/tests/test-setpayloadsigl.c b/tests/test-setpayloadsigl.c
> index 2512585ce8..678fdf1c1a 100644
> --- a/tests/test-setpayloadsigl.c
> +++ b/tests/test-setpayloadsigl.c
> @@ -28,7 +28,7 @@ SIGNATURE_CHECK (setpayloadsigl, int, (long double *,
> long double));
>  #include "isnanl-nolibm.h"
>  #include "macros.h"
>
> -#if defined __powerpc__ && LDBL_MANT_DIG == 106
> +#if (defined __ppc__ || defined __powerpc__) && LDBL_MANT_DIG == 106
>    /* This is PowerPC "double double", a pair of two doubles.  NaN is
> represented
>       as the corresponding 64-bit IEEE value in the first double; the
> second is
>       irrelevant and therefore does not contain a payload.  */
>
>
>
>

Reply via email to