Implement C23 pown

C23 adds various <math.h> function families originally defined in TS
18661-4.  Add the pown functions, which are like pow but with an
integer exponent.  That exponent has type long long int in C23; it was
intmax_t in TS 18661-4, and as with other interfaces changed after
their initial appearance in the TS, I don't think we need to support
the original version of the interface.  The test inputs are based on
the subset of test inputs for pow that use integer exponents that fit
in long long.

As the first such template implementation that saves and restores the
rounding mode internally (to avoid possible issues with directed
rounding and intermediate overflows or underflows in the wrong
rounding mode), support also needed to be added for using
SET_RESTORE_ROUND* in such template function implementations.  This
required math-type-macros-float128.h to include <fenv_private.h>, so
it can tell whether SET_RESTORE_ROUNDF128 is defined.  In turn, the
include order with <fenv_private.h> included before <math_private.h>
broke loongarch builds, showing up that
sysdeps/loongarch/math_private.h is really a fenv_private.h file
(maybe implemented internally before the consistent split of those
headers in 2018?) and needed to be renamed to fenv_private.h to avoid
errors with duplicate macro definitions if <math_private.h> is
included after <fenv_private.h>.

The underlying implementation uses __ieee754_pow functions (called
more than once in some cases, where the exponent does not fit in the
floating type).  I expect a custom implementation for a given format,
that only handles integer exponents but handles larger exponents
directly, could be faster and more accurate in some cases.

I encourage searching for worst cases for ulps error for these
implementations (necessarily non-exhaustively, given the size of the
input space).

Tested for x86_64 and x86, and with build-many-glibcs.py.
This commit is contained in:
Joseph Myers 2025-03-27 10:44:44 +00:00
parent be61b9493d
commit 75ad83f564
55 changed files with 14133 additions and 7 deletions

2
NEWS
View File

@ -14,7 +14,7 @@ Major new features:
functions for float, double, long double, _FloatN and _FloatNx, and a
type-generic macro in <tgmath.h>.
- Power and absolute-value functions: powr, rsqrt.
- Power and absolute-value functions: pown, powr, rsqrt.
* On Linux, the pthread_gettid_np function has been added.

View File

@ -789,6 +789,20 @@ but this is valid for @code{pow} if @var{power} is an integer.
The @code{powr} functions are from TS 18661-4:2015.
@end deftypefun
@deftypefun double pown (double @var{base}, long long int @var{power})
@deftypefunx float pownf (float @var{base}, long long int @var{power})
@deftypefunx {long double} pownl (long double @var{base}, long long int @var{power})
@deftypefunx _FloatN pownfN (_Float@var{N} @var{base}, long long int @var{power})
@deftypefunx _FloatNx pownfNx (_Float@var{N}x @var{base}, long long int @var{power})
@standards{TS 18661-4:2015, math.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
These return @var{base} raised to @var{power} (an integer).
The @code{pown} functions are from TS 18661-4:2015 (which used
@code{intmax_t} as the type of @var{power}; the type changed to
@code{long long int} in C23).
@end deftypefun
@cindex square root function
@deftypefun double sqrt (double @var{x})
@deftypefunx float sqrtf (float @var{x})

View File

@ -139,6 +139,7 @@ gen-libm-calls = \
s_log2p1F \
s_nanF \
s_nextdownF \
s_pownF \
s_powrF \
s_rsqrtF \
s_significandF \
@ -686,6 +687,7 @@ libm-test-funcs-auto = \
log1p \
log2p1 \
pow \
pown \
powr \
rsqrt \
sin \
@ -1018,6 +1020,7 @@ tgmath3-macros = \
nexttoward \
nextup \
pow \
pown \
powr \
remainder \
remquo \
@ -1442,6 +1445,7 @@ CFLAGS-s_nexttoward.c += -fno-builtin-nexttoward -fno-builtin-nexttowardl
CFLAGS-s_nexttowardf.c += -fno-builtin-nexttowardf
CFLAGS-s_nextup.c += -fno-builtin-nextupl
CFLAGS-e_pow.c += -fno-builtin-powl
CFLAGS-s_pown.c += -fno-builtin-pownl
CFLAGS-s_powr.c += -fno-builtin-powrl
CFLAGS-w_remainder.c += -fno-builtin-remainderl -fno-builtin-dreml
CFLAGS-s_remquo.c += -fno-builtin-remquol
@ -1578,6 +1582,7 @@ CFLAGS-s_nextafter.c += -fno-builtin-nextafterf32x -fno-builtin-nextafterf64
CFLAGS-s_nextdown.c += -fno-builtin-nextdownf32x -fno-builtin-nextdownf64
CFLAGS-s_nextup.c += -fno-builtin-nextupf32x -fno-builtin-nextupf64
CFLAGS-e_pow.c += -fno-builtin-powf32x -fno-builtin-powf64
CFLAGS-s_pown.c += -fno-builtin-pownf32x -fno-builtin-pownf64
CFLAGS-s_powr.c += -fno-builtin-powrf32x -fno-builtin-powrf64
CFLAGS-w_remainder.c += -fno-builtin-remainderf32x -fno-builtin-remainderf64
CFLAGS-s_remquo.c += -fno-builtin-remquof32x -fno-builtin-remquof64
@ -1705,6 +1710,7 @@ CFLAGS-s_nextafterf.c += -fno-builtin-nextafterf32
CFLAGS-s_nextdownf.c += -fno-builtin-nextdownf32
CFLAGS-s_nextupf.c += -fno-builtin-nextupf32
CFLAGS-e_powf.c += -fno-builtin-powf32
CFLAGS-s_pownf.c += -fno-builtin-pownf32
CFLAGS-s_powrf.c += -fno-builtin-powrf32
CFLAGS-w_remainderf.c += -fno-builtin-remainderf32
CFLAGS-s_remquof.c += -fno-builtin-remquof32

View File

@ -673,9 +673,11 @@ libm {
}
GLIBC_2.42 {
# Functions not involving _Float64x or _Float128, for all configurations.
pown; pownf; pownl; pownf32; pownf64; pownf32x;
powr; powrf; powrl; powrf32; powrf64; powrf32x;
rsqrt; rsqrtf; rsqrtl; rsqrtf32; rsqrtf64; rsqrtf32x;
# Functions involving _Float64x or _Float128, for some configurations.
pownf64x; pownf128;
powrf64x; powrf128;
rsqrtf64x; rsqrtf128;
}

View File

@ -8151,6 +8151,383 @@ pow 0x1.059c76p+0 0x1.ff80bep+11
pow 0x1.7ac7cp+5 23
pow -0x1.7ac7cp+5 23
pown 0 0
pown 0 -0
pown -0 0
pown -0 -0
pown 10 0
pown 10 -0
pown -10 0
pown -10 -0
pown 1 1
pown 1 -1
pown 1 0x4fffffffffffffff
# pown (x, +-0) == 1.
pown 32.75 0
pown 32.75 -0
pown -32.75 0
pown -32.75 -0
pown 0x1p72 0
pown 0x1p72 -0
pown 0x1p-72 0
pown 0x1p-72 -0
pown 0 1
pown 0 11
pown -0 1
pown -0 11
pown 0 2
pown -0 2
# pown (+0, y) == +0 for y an odd integer > 0.
pown 0.0 27
pown 0.0 0xffffff
pown 0.0 0x1fffffffffffff
# pown (-0, y) == -0 for y an odd integer > 0.
pown -0 27
pown -0 0xffffff
pown -0 0x1fffffe
pown -0 0x1fffffffffffff
pown -0 0x3ffffffffffffe
pown -0 0x7fffffffffffffff
# pown (+0, y) == +0 for y > 0 and not an odd integer.
pown 0.0 4
pown 0.0 0x1000000
# pown (-0, y) == +0 for y > 0 and not an odd integer.
pown -0 4
pown -0 0x1000000
pown 2 4
pown 256 8
pown -1.0 -0xffffff
pown -1.0 -0x1fffffe
pown -1.0 -0x1fffffffffffff
pown -1.0 -0x3ffffffffffffe
pown -1.0 -0x7fffffffffffffff
pown -1.0 0xffffff
pown -1.0 0x1fffffe
pown -1.0 0x1fffffffffffff
pown -1.0 0x3ffffffffffffe
pown -1.0 0x7fffffffffffffff
pown -2.0 126
pown -2.0 127
pown -2.0 -126
pown -2.0 -127
pown -2.0 -0xffffff
pown -2.0 -0x1fffffe
pown -2.0 -0x1fffffffffffff
pown -2.0 -0x3ffffffffffffe
pown -2.0 -0x7fffffffffffffff
pown -2.0 0xffffff
pown -2.0 0x1fffffe
pown -2.0 0x1fffffffffffff
pown -2.0 0x3ffffffffffffe
pown -2.0 0x7fffffffffffffff
pown -max -2
pown -max -3
pown -max 2
pown -max 3
pown -max -0xffffff
pown -max -0x1fffffe
pown -max -0x1fffffffffffff
pown -max -0x3ffffffffffffe
pown -max -0x7fffffffffffffff
pown -max 0xffffff
pown -max 0x1fffffe
pown -max 0x1fffffffffffff
pown -max 0x3ffffffffffffe
pown -max 0x7fffffffffffffff
pown -0x1p65 2
pown -0x1p65 3
pown -0x1p65 4
pown -0x1p65 5
pown -0x1p43 3
pown -0x1p43 4
pown -0x1p43 5
pown -0x1p33 4
pown -0x1p33 5
pown -0x1p26 5
pown -0x1p-65 -2
pown -0x1p-65 -3
pown -0x1p-65 -4
pown -0x1p-65 -5
pown -0x1p-43 -3
pown -0x1p-43 -4
pown -0x1p-43 -5
pown -0x1p-33 -4
pown -0x1p-33 -5
pown -0x1p-26 -5
pown -0x1p513 2
pown -0x1p513 3
pown -0x1p513 4
pown -0x1p513 5
pown -0x1p342 3
pown -0x1p342 4
pown -0x1p342 5
pown -0x1p257 4
pown -0x1p257 5
pown -0x1p205 5
pown -0x1p-513 -2
pown -0x1p-513 -3
pown -0x1p-513 -4
pown -0x1p-513 -5
pown -0x1p-342 -3
pown -0x1p-342 -4
pown -0x1p-342 -5
pown -0x1p-257 -4
pown -0x1p-257 -5
pown -0x1p-205 -5
pown -0x1p8192 2
pown -0x1p8192 3
pown -0x1p8192 4
pown -0x1p8192 5
pown -0x1p5462 3
pown -0x1p5462 4
pown -0x1p5462 5
pown -0x1p4097 4
pown -0x1p4097 5
pown -0x1p3277 5
pown -0x1p64 257
pown -0x1p-8192 -2
pown -0x1p-8192 -3
pown -0x1p-8192 -4
pown -0x1p-8192 -5
pown -0x1p-5462 -3
pown -0x1p-5462 -4
pown -0x1p-5462 -5
pown -0x1p-4097 -4
pown -0x1p-4097 -5
pown -0x1p-3277 -5
pown -0x1p-64 -257
pown -0.5 126
pown -0.5 127
pown -0.5 -126
pown -0.5 -127
pown -0.5 -0xffffff
pown -0.5 -0x1fffffe
pown -0.5 -0x1fffffffffffff
pown -0.5 -0x3ffffffffffffe
pown -0.5 -0x7fffffffffffffff
pown -0.5 0xffffff
pown -0.5 0x1fffffe
pown -0.5 0x1fffffffffffff
pown -0.5 0x3ffffffffffffe
pown -0.5 0x7fffffffffffffff
pown -min -2
pown -min -3
pown -min 1
pown -min 2
pown -min 3
pown -min -0xffffff
pown -min -0x1fffffe
pown -min -0x1fffffffffffff
pown -min -0x3ffffffffffffe
pown -min -0x7fffffffffffffff
pown -min 0xffffff
pown -min 0x1fffffe
pown -min 0x1fffffffffffff
pown -min 0x3ffffffffffffe
pown -min 0x7fffffffffffffff
pown 0x0.ffffffp0 10
pown 0x0.ffffffp0 100
pown 0x0.ffffffp0 1000
pown 0x0.ffffffp0 0x1000000
pown 0x0.ffffffp0 0x40000000
pown 0x0.ffffffp0 0x48d15980
pown 0x0.ffffffp0 -10
pown 0x0.ffffffp0 -100
pown 0x0.ffffffp0 -1000
pown 0x0.ffffffp0 -0x1000000
pown 0x0.ffffffp0 -0x40000000
pown 0x0.ffffffp0 -0x48d15980
pown 0x1.000002p0 0x1000000
pown 0x1.000002p0 0x2468acc0
pown 0x1.000002p0 -0x2468acc0
pown 0x0.fffffffffffff8p0 0x48d159e26af37c00
pown 0x0.fffffffffffff8p0 -0x48d159e26af37c00
pown 0x1.0000000000001p0 0x2468acf13579be00
pown 0x1.0000000000001p0 -0x2468acf13579be00
pown -0x0.ffffffp0 10
pown -0x0.ffffffp0 100
pown -0x0.ffffffp0 1000
pown -0x0.ffffffp0 0x1000000
pown -0x0.ffffffp0 0x40000000
pown -0x0.ffffffp0 0x48d15980
pown -0x0.ffffffp0 -10
pown -0x0.ffffffp0 -100
pown -0x0.ffffffp0 -1000
pown -0x0.ffffffp0 -0x1000000
pown -0x0.ffffffp0 -0x40000000
pown -0x0.ffffffp0 -0x48d15980
pown -0x1.000002p0 0x1000000
pown -0x1.000002p0 0x2468acc0
pown -0x1.000002p0 -0x2468acc0
pown -0x0.fffffffffffff8p0 0x48d159e26af37c00
pown -0x0.fffffffffffff8p0 -0x48d159e26af37c00
pown -0x1.0000000000001p0 0x2468acf13579be00
pown -0x1.0000000000001p0 -0x2468acf13579be00
pown 0x1.000002p0 0x40000000
pown -0x1.000002p0 0x40000000
pown 0x1.00000ep0 0x40000000
pown -0x1.00000ep0 0x40000000
pown 10.0 4932
pown 10.0 4931
pown 10.0 4930
pown 10.0 4929
pown 10.0 -4931
pown 10.0 -4930
pown 10.0 -4929
pown 1e27 182
pown 1e27 -182
pown 2.0 -100000
pown 0x1.00001p1 -126
pown -0x1.00002p1 -126
pown 0x1.00003p1 -126
pown -0x1.00004p1 -126
pown 0x1.00005p1 -126
pown -0x1.00006p1 -126
pown 0x1.00007p1 -126
pown 0x1.00001p1 -969
pown -0x1.00002p1 -969
pown 0x1.00003p1 -969
pown -0x1.00004p1 -969
pown 0x1.00005p1 -969
pown -0x1.00006p1 -969
pown 0x1.00007p1 -969
pown 0x1.00001p1 -1022
pown -0x1.00002p1 -1022
pown 0x1.00003p1 -1022
pown -0x1.00004p1 -1022
pown 0x1.00005p1 -1022
pown -0x1.00006p1 -1022
pown 0x1.00007p1 -1022
pown 0x1.00001p1 -16382
pown -0x1.00002p1 -16382
pown 0x1.00003p1 -16382
pown -0x1.00004p1 -16382
pown 0x1.00005p1 -16382
pown -0x1.00006p1 -16382
pown 0x1.00007p1 -16382
pown 0x1.00001p1 -16383
pown -0x1.00002p1 -16383
pown 0x1.00003p1 -16383
pown -0x1.00004p1 -16383
pown 0x1.00005p1 -16383
pown -0x1.00006p1 -16383
pown 0x1.00007p1 -16383
pown 0x0.ffff1p-1 126
pown -0x0.ffff2p-1 126
pown 0x0.ffff3p-1 126
pown -0x0.ffff4p-1 126
pown 0x0.ffff5p-1 126
pown -0x0.ffff6p-1 126
pown 0x0.ffff7p-1 126
pown 0x0.ffff1p-1 969
pown -0x0.ffff2p-1 969
pown 0x0.ffff3p-1 969
pown -0x0.ffff4p-1 969
pown 0x0.ffff5p-1 969
pown -0x0.ffff6p-1 969
pown 0x0.ffff7p-1 969
pown 0x0.ffff1p-1 1022
pown -0x0.ffff2p-1 1022
pown 0x0.ffff3p-1 1022
pown -0x0.ffff4p-1 1022
pown 0x0.ffff5p-1 1022
pown -0x0.ffff6p-1 1022
pown 0x0.ffff7p-1 1022
pown 0x0.ffff1p-1 16382
pown -0x0.ffff2p-1 16382
pown 0x0.ffff3p-1 16382
pown -0x0.ffff4p-1 16382
pown 0x0.ffff5p-1 16382
pown -0x0.ffff6p-1 16382
pown 0x0.ffff7p-1 16382
pown 0x0.ffff1p-1 16383
pown -0x0.ffff2p-1 16383
pown 0x0.ffff3p-1 16383
pown -0x0.ffff4p-1 16383
pown 0x0.ffff5p-1 16383
pown -0x0.ffff6p-1 16383
pown 0x0.ffff7p-1 16383
pown 0x2.000b3p0 -1022
pown 0x2.000582p0 -1022
pown 10 -1
pown 10 -2
pown 10 -3
pown 10 -4
pown 10 -5
pown 10 -6
pown 10 -7
pown 0x0.ffffffffffffffffp0 1
pown 0x0.ffffffffffffffffp0 2
pown 0x0.ffffffffffffffffp0 3
pown 0x0.ffffffffffffffffp0 4
pown 0x0.ffffffffffffffffp0 5
pown 0x0.ffffffffffffffffp0 6
pown 0x0.ffffffffffffffffp0 7
pown 0x0.ffffffffffffffffp0 -1
pown 0x0.ffffffffffffffffp0 -2
pown 0x0.ffffffffffffffffp0 -3
pown 0x0.ffffffffffffffffp0 -4
pown 0x0.ffffffffffffffffp0 -5
pown 0x0.ffffffffffffffffp0 -6
pown 0x0.ffffffffffffffffp0 -7
pown 0x1.0000000000000002p0 1
pown 0x1.0000000000000002p0 2
pown 0x1.0000000000000002p0 3
pown 0x1.0000000000000002p0 4
pown 0x1.0000000000000002p0 5
pown 0x1.0000000000000002p0 6
pown 0x1.0000000000000002p0 7
pown 0x1.0000000000000002p0 -1
pown 0x1.0000000000000002p0 -2
pown 0x1.0000000000000002p0 -3
pown 0x1.0000000000000002p0 -4
pown 0x1.0000000000000002p0 -5
pown 0x1.0000000000000002p0 -6
pown 0x1.0000000000000002p0 -7
pown 0x1.7ac7cp+5 23
pown -0x1.7ac7cp+5 23
powr 10 0
powr 10 -0

13182
math/auto-libm-test-out-pown Normal file

File diff suppressed because it is too large Load Diff

View File

@ -186,6 +186,9 @@ __MATHCALL_VEC (cbrt,, (_Mdouble_ __x));
#endif
#if __GLIBC_USE (IEC_60559_FUNCS_EXT_C23)
/* Return X to the Y power. */
__MATHCALL (pown,, (_Mdouble_ __x, long long int __y));
/* Return X to the Y power. */
__MATHCALL (powr,, (_Mdouble_ __x, _Mdouble_ __y));

View File

@ -428,6 +428,9 @@ typedef enum
/* MPFR function with integer and floating-point arguments and one
result. */
mpfr_if_f,
/* MPFR function with floating-point and integer arguments and one
result. */
mpfr_fi_f,
/* MPFR function with a single argument and two floating-point
results. */
mpfr_f_11,
@ -456,6 +459,7 @@ typedef struct
mpfr_rnd_t);
int (*mpfr_f_f1) (mpfr_t, int *, const mpfr_t, mpfr_rnd_t);
int (*mpfr_if_f) (mpfr_t, long, const mpfr_t, mpfr_rnd_t);
int (*mpfr_fi_f) (mpfr_t, const mpfr_t, long, mpfr_rnd_t);
int (*mpfr_f_11) (mpfr_t, mpfr_t, const mpfr_t, mpfr_rnd_t);
int (*mpc_c_f) (mpfr_t, const mpc_t, mpfr_rnd_t);
int (*mpc_c_c) (mpc_t, const mpc_t, mpc_rnd_t);
@ -517,6 +521,9 @@ typedef struct
#define FUNC_mpfr_if_f(NAME, MPFR_FUNC, EXACT) \
FUNC (NAME, ARGS2 (type_int, type_fp), RET1 (type_fp), EXACT, false, \
false, CALC (mpfr_if_f, MPFR_FUNC))
#define FUNC_mpfr_fL_f(NAME, MPFR_FUNC, EXACT) \
FUNC (NAME, ARGS2 (type_fp, type_long_long), RET1 (type_fp), EXACT, \
false, false, CALC (mpfr_fi_f, MPFR_FUNC))
#define FUNC_mpc_c_f(NAME, MPFR_FUNC, EXACT) \
FUNC (NAME, ARGS2 (type_fp, type_fp), RET1 (type_fp), EXACT, true, \
false, CALC (mpc_c_f, MPFR_FUNC))
@ -589,6 +596,7 @@ static test_function test_functions[] =
FUNC_mpfr_f_f ("log2p1", mpfr_log2p1, false),
FUNC_mpfr_ff_f ("mul", mpfr_mul, true),
FUNC_mpfr_ff_f ("pow", mpfr_pow, false),
FUNC_mpfr_fL_f ("pown", mpfr_pow_si, false),
FUNC_mpfr_ff_f ("powr", mpfr_powr, false),
/* mpfr_rec_sqrt differs from rsqrt on -0, but gen-auto-libm-tests
does not handle results that are exact infinities anyway. */
@ -1557,6 +1565,20 @@ calc_generic_results (generic_value *outputs, generic_value *inputs,
adjust_real (outputs[0].value.f, inexact);
break;
case mpfr_fi_f:
assert (inputs[0].type == gtype_fp);
assert (inputs[1].type == gtype_int);
outputs[0].type = gtype_fp;
mpfr_init (outputs[0].value.f);
assert (mpz_fits_slong_p (inputs[1].value.i));
l = mpz_get_si (inputs[1].value.i);
inexact = calc->func.mpfr_fi_f (outputs[0].value.f,
inputs[0].value.f, l, mode_mpfr);
if (mode != rm_towardzero)
assert (!inexact && mpfr_zero_p (outputs[0].value.f));
adjust_real (outputs[0].value.f, inexact);
break;
case mpfr_f_11:
assert (inputs[0].type == gtype_fp);
outputs[0].type = gtype_fp;

View File

@ -753,6 +753,7 @@ class Tests(object):
self.add_tests('log2p1', 'r', ['r'])
self.add_tests('log10p1', 'r', ['r'])
self.add_tests('logp1', 'r', ['r'])
self.add_tests('pown', 'r', ['r', 'long long int'])
self.add_tests('powr', 'r', ['r', 'r'])
self.add_tests('rsqrt', 'r', ['r'])
self.add_tests('sinpi', 'r', ['r'])

View File

@ -222,6 +222,17 @@ struct test_fl_f_data
int exceptions;
} rd, rn, rz, ru;
};
struct test_fL_f_data
{
const char *arg_str;
FLOAT arg1;
long long int arg2;
struct
{
FLOAT expected;
int exceptions;
} rd, rn, rz, ru;
};
struct test_if_f_data
{
const char *arg_str;
@ -544,6 +555,8 @@ struct test_Ff_b1_data
#define RUN_TEST_LOOP_fi_f RUN_TEST_LOOP_2_f
#define RUN_TEST_fl_f RUN_TEST_2_f
#define RUN_TEST_LOOP_fl_f RUN_TEST_LOOP_2_f
#define RUN_TEST_fL_f RUN_TEST_2_f
#define RUN_TEST_LOOP_fL_f RUN_TEST_LOOP_2_f
#define RUN_TEST_if_f RUN_TEST_2_f
#define RUN_TEST_LOOP_if_f RUN_TEST_LOOP_2_f
#define RUN_TEST_3_f(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3, \

150
math/libm-test-pown.inc Normal file
View File

@ -0,0 +1,150 @@
/* Test pown.
Copyright (C) 1997-2025 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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.
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
<https://www.gnu.org/licenses/>. */
#include "libm-test-driver.c"
static const struct test_fL_f_data pown_test_data[] =
{
TEST_ff_f (pown, qnan_value, 0, 1, ERRNO_UNCHANGED|NO_TEST_MATHVEC),
TEST_ff_f (pown, -qnan_value, 0, 1, ERRNO_UNCHANGED|NO_TEST_MATHVEC),
TEST_ff_f (pown, snan_value, 0, qnan_value, INVALID_EXCEPTION|NO_TEST_MATHVEC),
TEST_ff_f (pown, -snan_value, 0, qnan_value, INVALID_EXCEPTION|NO_TEST_MATHVEC),
TEST_ff_f (pown, plus_infty, 1, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, -1, 0, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 1, minus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 11, minus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 1001, minus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 2, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 12, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 1002, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -1, minus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -11, minus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -1001, minus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -2, 0, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -12, 0, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -1002, 0, ERRNO_UNCHANGED),
TEST_ff_f (pown, qnan_value, 1, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, -qnan_value, 1, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, snan_value, 1, qnan_value, INVALID_EXCEPTION),
TEST_ff_f (pown, -snan_value, 1, qnan_value, INVALID_EXCEPTION),
TEST_ff_f (pown, qnan_value, -1, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, -qnan_value, -1, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, snan_value, -1, qnan_value, INVALID_EXCEPTION),
TEST_ff_f (pown, -snan_value, -1, qnan_value, INVALID_EXCEPTION),
TEST_ff_f (pown, qnan_value, 3, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, -qnan_value, 3, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, qnan_value, -3, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, -qnan_value, -3, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (pown, snan_value, 3, qnan_value, INVALID_EXCEPTION),
TEST_ff_f (pown, -snan_value, 3, qnan_value, INVALID_EXCEPTION),
TEST_ff_f (pown, snan_value, -3, qnan_value, INVALID_EXCEPTION),
TEST_ff_f (pown, -snan_value, -3, qnan_value, INVALID_EXCEPTION),
/* pown (x, 0) == 1. */
TEST_ff_f (pown, plus_infty, 0, 1, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0, 1, ERRNO_UNCHANGED),
TEST_ff_f (pown, 0, -1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -11, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -0xfffffe, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -0xffffff, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -0x1ffffffffffffeLL, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -0x1fffffffffffffLL, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -0x7ffffffffffffffeLL, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -0x7fffffffffffffffLL, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -11L, minus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0xfffffe, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0xffffff, minus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0x1fffffe, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0x1ffffffffffffeLL, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0x1fffffffffffffLL, minus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0x3ffffffffffffeLL, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0x7ffffffffffffffeLL, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0x7fffffffffffffffLL, minus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -2, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, 0, -0x1000000, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -2, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
TEST_ff_f (pown, minus_zero, -0x1000000, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
/* pown (+inf, y) == +inf for y > 0. */
TEST_ff_f (pown, plus_infty, 2, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, 0xffffff, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, 0x1fffffffffffffLL, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, 0x7fffffffffffffffLL, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, 0x1000000, plus_infty, ERRNO_UNCHANGED),
/* pown (+inf, y) == +0 for y < 0. */
TEST_ff_f (pown, plus_infty, -1, 0.0, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, -0xffffff, 0.0, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, -0x1fffffffffffffLL, 0.0, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, -0x7fffffffffffffffLL, 0.0, ERRNO_UNCHANGED),
TEST_ff_f (pown, plus_infty, -0x1000000, 0.0, ERRNO_UNCHANGED),
/* pown (-inf, y) == -inf for y an odd integer > 0. */
TEST_ff_f (pown, minus_infty, 27, minus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0xffffff, minus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0x1fffffe, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0x1fffffffffffffLL, minus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0x3ffffffffffffeL, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0x7ffffffffffffffeLL, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0x7fffffffffffffffLL, minus_infty, ERRNO_UNCHANGED),
/* pown (-inf, y) == +inf for y > 0 and not an odd integer. */
TEST_ff_f (pown, minus_infty, 28, plus_infty, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, 0x1000000, plus_infty, ERRNO_UNCHANGED),
/* pown (-inf, y) == -0 for y an odd integer < 0. */
TEST_ff_f (pown, minus_infty, -3, minus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0xfffffe, plus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0xffffff, minus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0x1fffffe, plus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0x1ffffffffffffeLL, plus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0x1fffffffffffffLL, minus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0x3ffffffffffffeLL, plus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0x7ffffffffffffffeLL, plus_zero, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0x7fffffffffffffffLL, minus_zero, ERRNO_UNCHANGED),
/* pown (-inf, y) == +0 for y < 0 and not an odd integer. */
TEST_ff_f (pown, minus_infty, -2, 0.0, ERRNO_UNCHANGED),
TEST_ff_f (pown, minus_infty, -0x1000000, 0.0, ERRNO_UNCHANGED),
AUTO_TESTS_ff_f (pown),
};
static void
pown_test (void)
{
ALL_RM_TEST (pown, 0, pown_test_data, RUN_TEST_LOOP_fL_f, END);
}
static void
do_test (void)
{
pown_test ();
}
/*
* Local Variables:
* mode:c
* End:
*/

91
math/s_pown_template.c Normal file
View File

@ -0,0 +1,91 @@
/* Return X^Y for integer Y.
Copyright (C) 2025 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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.
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
<https://www.gnu.org/licenses/>. */
#include <errno.h>
#include <fenv_private.h>
#include <limits.h>
#include <math.h>
#include <math-barriers.h>
#include <math-narrow-eval.h>
#include <math_private.h>
#include <stdlib.h>
FLOAT
M_DECL_FUNC (__pown) (FLOAT x, long long int y)
{
FLOAT ret;
#if M_MANT_DIG >= LLONG_WIDTH - 1
ret = M_SUF (__ieee754_pow) (x, y);
#else
if ((y <= 1LL << M_MANT_DIG
&& y >= -(1LL << M_MANT_DIG))
|| y == LLONG_MIN)
ret = M_SUF (__ieee754_pow) (x, y);
else
{
{
/* To avoid problems with overflow and underflow from
intermediate computations occurring in the wrong directed
rounding mode (when X is negative and Y is odd), do these
computations in round-to-nearest mode and correct
overflowing and underflowing results afterwards. */
M_SET_RESTORE_ROUND (FE_TONEAREST);
ret = M_LIT (1.0);
while (y != 0)
{
long long int absy = llabs (y);
int bits = LLONG_WIDTH - __builtin_clzll (absy);
if (bits <= M_MANT_DIG)
{
ret *= M_SUF (__ieee754_pow) (x, y);
y = 0;
}
else
{
long long int absy_high
= absy & (((1ULL << M_MANT_DIG) - 1) << (bits - M_MANT_DIG));
long long int absy_low = absy - absy_high;
long long int y_high = y < 0 ? -absy_high : absy_high;
ret *= M_SUF (__ieee754_pow) (x, y_high);
y = y < 0 ? -absy_low : absy_low;
}
}
ret = math_narrow_eval (ret);
math_force_eval (ret);
}
if (isfinite (x) && x != M_LIT (0.0))
{
if (isinf (ret))
ret = math_narrow_eval (M_COPYSIGN (M_MAX, ret) * M_MAX);
else if (ret == M_LIT (0.0))
ret = math_narrow_eval (M_COPYSIGN (M_MIN, ret) * M_MIN);
}
}
#endif
if (!isfinite (ret))
{
if (isfinite (x))
__set_errno (ERANGE);
}
else if (ret == 0
&& isfinite (x)
&& x != 0)
__set_errno (ERANGE);
return ret;
}
declare_mgen_alias (__pown, pown);

View File

@ -48,7 +48,7 @@ volatile int count_cdouble;
volatile int count_cfloat;
volatile int count_cldouble;
#define NCALLS 188
#define NCALLS 190
#define NCALLS_INT 4
#define NCCALLS 47
@ -227,7 +227,7 @@ F(compile_test) (void)
int i = 2;
int saved_count;
long int j;
long long int k;
long long int k = 2;
intmax_t m;
uintmax_t um;
@ -268,6 +268,7 @@ F(compile_test) (void)
a = log10p1 (log10p1 (x));
a = logp1 (logp1 (x));
a = pow (pow (x, a), pow (c, b));
b = pown (pown (x, k), k);
a = powr (powr (x, a), powr (c, b));
b = sqrt (sqrt (a));
a = rsqrt (rsqrt (b));
@ -395,6 +396,7 @@ F(compile_test) (void)
a = log10p1 (y);
a = logp1 (y);
a = pow (y, y);
a = pown (y, 12345);
a = powr (y, y);
a = sqrt (y);
a = rsqrt (y);
@ -773,6 +775,14 @@ TYPE
return x + y;
}
TYPE
(F(pown)) (TYPE x, long long int y)
{
++count;
P ();
return x + y;
}
TYPE
(F(powr)) (TYPE x, TYPE y)
{

View File

@ -924,6 +924,9 @@
#define cbrt(Val) __TGMATH_UNARY_REAL_ONLY (Val, cbrt)
#if __GLIBC_USE (IEC_60559_FUNCS_EXT_C23)
/* Return X to the Y power. */
# define pown(Val1, Val2) __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, pown)
/* Return X to the Y power. */
# define powr(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, powr)

View File

@ -28,6 +28,8 @@
#define M_STRTO_NAN __strtod_nan
#define M_USE_BUILTIN(c) USE_ ##c ##_BUILTIN
#define M_SET_RESTORE_ROUND(RM) SET_RESTORE_ROUND (RM)
#include <libm-alias-double.h>
#include <math-nan-payload-double.h>

View File

@ -30,6 +30,8 @@
/* GNU extension float constant macros. */
#define M_MLIT(c) c ## f
#define M_SET_RESTORE_ROUND(RM) SET_RESTORE_ROUNDF (RM)
#include <libm-alias-float.h>
#include <math-nan-payload-float.h>

View File

@ -19,6 +19,8 @@
#ifndef _MATH_TYPE_MACROS_FLOAT128
#define _MATH_TYPE_MACROS_FLOAT128
#include <fenv_private.h>
#define M_LIT(c) __f128 (c)
#define M_PFX FLT128
#define M_SUF(c) c ## f128
@ -30,6 +32,13 @@
#define M_MLIT(c) c ## f128
/* fenv_private.h may not define SET_RESTORE_ROUNDF128. */
#ifdef SET_RESTORE_ROUNDF128
# define M_SET_RESTORE_ROUND(RM) SET_RESTORE_ROUNDF128 (RM)
#else
# define M_SET_RESTORE_ROUND(RM) SET_RESTORE_ROUNDL (RM)
#endif
#include <libm-alias-float128.h>
#include <math-nan-payload-float128.h>

View File

@ -28,6 +28,8 @@
#define M_STRTO_NAN __strtold_nan
#define M_USE_BUILTIN(c) USE_ ##c ##L_BUILTIN
#define M_SET_RESTORE_ROUND(RM) SET_RESTORE_ROUNDL (RM)
#include <libm-alias-ldouble.h>
#include <math-nan-payload-ldouble.h>

View File

@ -33,6 +33,7 @@
M_STRTO_NAN - Resolves to the internal libc function which
converts a string into the appropriate FLOAT nan
value.
M_SET_RESTORE_ROUND - Resolves to a SET_RESTORE_ROUND call for M_TYPE.
declare_mgen_alias(from,to)
This exposes the appropriate symbol(s) for a

View File

@ -154,6 +154,7 @@ libm {
__tanpiieee128;
}
GLIBC_2.42 {
__pownieee128;
__powrieee128;
__rsqrtieee128;
}

View File

@ -166,6 +166,7 @@ libnldbl-calls = \
obstack_vprintf \
obstack_vprintf_chk \
pow \
pown \
powr \
printf \
printf_chk \
@ -376,6 +377,7 @@ CFLAGS-nldbl-nexttoward.c = -fno-builtin-nexttoward -fno-builtin-nexttowardl
CFLAGS-nldbl-nexttowardf.c = -fno-builtin-nexttowardf
CFLAGS-nldbl-nextup.c = -fno-builtin-nextupl
CFLAGS-nldbl-pow.c = -fno-builtin-powl
CFLAGS-nldbl-pown.c = -fno-builtin-pownl
CFLAGS-nldbl-powr.c = -fno-builtin-powrl
CFLAGS-nldbl-remainder.c = -fno-builtin-remainderl -fno-builtin-dreml
CFLAGS-nldbl-remquo.c = -fno-builtin-remquol

View File

@ -0,0 +1,8 @@
#include "nldbl-compat.h"
double
attribute_hidden
pownl (double x, long long int y)
{
return pown (x, y);
}

View File

@ -16,11 +16,11 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef LOONGARCH_MATH_PRIVATE_H
#define LOONGARCH_MATH_PRIVATE_H 1
#ifndef LOONGARCH_FENV_PRIVATE_H
#define LOONGARCH_FENV_PRIVATE_H 1
/* Inline functions to speed up the math library implementation. The
default versions of these routines are in generic/math_private.h
default versions of these routines are in generic/fenv_private.h
and call fesetround, feholdexcept, etc. These routines use inlined
code instead. */
@ -243,6 +243,6 @@ libc_feholdsetround_loongarch_ctx (struct rm_ctx *ctx, int round)
#endif
#include_next <math_private.h>
#include_next <fenv_private.h>
#endif

View File

@ -1277,6 +1277,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1134,6 +1134,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1245,6 +1245,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1404,6 +1404,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -829,6 +829,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -895,6 +895,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -1284,6 +1284,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1124,6 +1124,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -956,6 +956,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -1245,6 +1245,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -829,6 +829,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -1067,6 +1067,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -1066,6 +1066,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -1060,6 +1060,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -1429,8 +1429,17 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 __pownieee128 F
GLIBC_2.42 __powrieee128 F
GLIBC_2.42 __rsqrtieee128 F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1124,6 +1124,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1221,6 +1221,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1348,6 +1348,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1348,6 +1348,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -920,6 +920,12 @@ GLIBC_2.41 tanpif32 F
GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf32 F

View File

@ -1355,6 +1355,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1245,6 +1245,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1278,6 +1278,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F

View File

@ -1278,6 +1278,14 @@ GLIBC_2.41 tanpif32x F
GLIBC_2.41 tanpif64 F
GLIBC_2.41 tanpif64x F
GLIBC_2.41 tanpil F
GLIBC_2.42 pown F
GLIBC_2.42 pownf F
GLIBC_2.42 pownf128 F
GLIBC_2.42 pownf32 F
GLIBC_2.42 pownf32x F
GLIBC_2.42 pownf64 F
GLIBC_2.42 pownf64x F
GLIBC_2.42 pownl F
GLIBC_2.42 powr F
GLIBC_2.42 powrf F
GLIBC_2.42 powrf128 F