mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	This patch converts libm function implementations in math/ from using weak_alias to using libm_alias_ldouble to define public function names, in cases where it would be appropriate to define _Float128 / _Float64x aliases for those functions as well (in cases where either or both of those types exist and have the same ABI as long double). This eliminates many ldbl-opt wrappers round these function implementations. Tested for x86_64, and with build-many-glibcs.py. All installed stripped shared libraries are unchanged except for libm.so on powerpc64le. As noted for a previous patch, powerpc64le's use of ldbl-opt means various long double functions get defined using long_double_symbol which gives them an explicit symbol version in the object files, and this patch results in some such functions using weak_alias instead (because powerpc64le never had a previous version of these functions for long double = double); both produce a valid libm.so with the same public symbols at the same versions, but macros expanding to call weak_alias is cleaner in this case. * math/s_fmal.c: Include <libm-alias-ldouble.h>. (fmal): Define using libm_alias_ldouble. * math/w_acoshl_compat.c: Include <libm-alias-ldouble.h>. (acoshl): Define using libm_alias_ldouble. * math/w_acosl_compat.c: Include <libm-alias-ldouble.h>. (acosl): Define using libm_alias_ldouble. * math/w_asinl_compat.c: Include <libm-alias-ldouble.h>. (asinl): Define using libm_alias_ldouble. * math/w_atan2l_compat.c: Include <libm-alias-ldouble.h>. (atan2l): Define using libm_alias_ldouble. * math/w_atanhl_compat.c: Include <libm-alias-ldouble.h>. (atanhl): Define using libm_alias_ldouble. * math/w_coshl_compat.c: Include <libm-alias-ldouble.h>. (coshl): Define using libm_alias_ldouble. * math/w_exp10l_compat.c: Include <libm-alias-ldouble.h>. (exp10l): Define using libm_alias_ldouble. * math/w_exp2l_compat.c: Include <libm-alias-ldouble.h>. (exp2l): Define using libm_alias_ldouble. * math/w_expl_compat.c: Include <libm-alias-ldouble.h>. (expl): Define using libm_alias_ldouble. * math/w_fmodl_compat.c: Include <libm-alias-ldouble.h>. (fmodl): Define using libm_alias_ldouble. * math/w_hypotl_compat.c: Include <libm-alias-ldouble.h>. (hypotl): Define using libm_alias_ldouble. * math/w_j0l_compat.c: Include <libm-alias-ldouble.h>. (j0l): Define using libm_alias_ldouble. (y0l): Likewise. * math/w_j1l_compat.c: Include <libm-alias-ldouble.h>. (j1l): Define using libm_alias_ldouble. (y1l): Likewise. * math/w_jnl_compat.c: Include <libm-alias-ldouble.h>. (jnl): Define using libm_alias_ldouble. (ynl): Likewise. * math/w_log10l_compat.c: Include <libm-alias-ldouble.h>. (log10l): Define using libm_alias_ldouble. * math/w_log2l_compat.c: Include <libm-alias-ldouble.h>. (log2l): Define using libm_alias_ldouble. * math/w_logl_compat.c: Include <libm-alias-ldouble.h>. (logl): Define using libm_alias_ldouble. * math/w_powl_compat.c: Include <libm-alias-ldouble.h>. (powl): Define using libm_alias_ldouble. * math/w_remainderl_compat.c: Include <libm-alias-ldouble.h>. (remainderl): Define using libm_alias_ldouble. * math/w_sinhl_compat.c: Include <libm-alias-ldouble.h>. (sinhl): Define using libm_alias_ldouble. * math/w_sqrtl_compat.c: Include <libm-alias-ldouble.h>. (sqrtl): Define using libm_alias_ldouble. * math/w_tgammal_compat.c: Include <libm-alias-ldouble.h>. (tgammal): Define using libm_alias_ldouble. * sysdeps/ieee754/ldbl-opt/w_exp10l_compat.c [LIBM_SVID_COMPAT] (exp10l): Do not use long_double_symbol here. * sysdeps/ieee754/ldbl-opt/w_remainderl_compat.c [LIBM_SVID_COMPAT] (remainderl): Likewise. * sysdeps/ieee754/ldbl-opt/s_fmal.c: Remove. * sysdeps/ieee754/ldbl-opt/w_acoshl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_acosl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_asinl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_atan2l_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_atanhl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_coshl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_expl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_fmodl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_hypotl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_j0l_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_j1l_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_jnl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_log10l_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_log2l_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_logl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_powl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_sinhl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_sqrtl_compat.c: Likewise. * sysdeps/ieee754/ldbl-opt/w_tgammal_compat.c: Likewise.
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* w_jnl.c -- long double version of w_jn.c.
 | |
|  * Conversion to long double by Ulrich Drepper,
 | |
|  * Cygnus Support, drepper@cygnus.com.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * ====================================================
 | |
|  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 | |
|  *
 | |
|  * Developed at SunPro, a Sun Microsystems, Inc. business.
 | |
|  * Permission to use, copy, modify, and distribute this
 | |
|  * software is freely granted, provided that this notice
 | |
|  * is preserved.
 | |
|  * ====================================================
 | |
|  */
 | |
| 
 | |
| #if defined(LIBM_SCCS) && !defined(lint)
 | |
| static char rcsid[] = "$NetBSD: $";
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * wrapper jn(int n, double x), yn(int n, double x)
 | |
|  * floating point Bessel's function of the 1st and 2nd kind
 | |
|  * of order n
 | |
|  *
 | |
|  * Special cases:
 | |
|  *	y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
 | |
|  *	y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
 | |
|  * Note 2. About jn(n,x), yn(n,x)
 | |
|  *	For n=0, j0(x) is called,
 | |
|  *	for n=1, j1(x) is called,
 | |
|  *	for n<x, forward recursion us used starting
 | |
|  *	from values of j0(x) and j1(x).
 | |
|  *	for n>x, a continued fraction approximation to
 | |
|  *	j(n,x)/j(n-1,x) is evaluated and then backward
 | |
|  *	recursion is used starting from a supposed value
 | |
|  *	for j(n,x). The resulting value of j(0,x) is
 | |
|  *	compared with the actual value to correct the
 | |
|  *	supposed value of j(n,x).
 | |
|  *
 | |
|  *	yn(n,x) is similar in all respects, except
 | |
|  *	that forward recursion is used for all
 | |
|  *	values of n>1.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <math.h>
 | |
| #include <math_private.h>
 | |
| #include <math-svid-compat.h>
 | |
| #include <libm-alias-ldouble.h>
 | |
| 
 | |
| #if LIBM_SVID_COMPAT
 | |
| long double __jnl(int n, long double x)	/* wrapper jnl */
 | |
| {
 | |
| # ifdef _IEEE_LIBM
 | |
| 	return __ieee754_jnl(n,x);
 | |
| # else
 | |
| 	long double z;
 | |
| 	z = __ieee754_jnl(n,x);
 | |
| 	if (_LIB_VERSION == _IEEE_
 | |
| 	    || _LIB_VERSION == _POSIX_
 | |
| 	    || isnan(x))
 | |
| 	  return z;
 | |
| 	if(fabsl(x)>X_TLOSS) {
 | |
| 	    return __kernel_standard_l((double)n,x,238); /* jn(|x|>X_TLOSS,n) */
 | |
| 	} else
 | |
| 	    return z;
 | |
| # endif
 | |
| }
 | |
| libm_alias_ldouble (__jn, jn)
 | |
| 
 | |
| long double __ynl(int n, long double x)	/* wrapper ynl */
 | |
| {
 | |
| # ifdef _IEEE_LIBM
 | |
| 	return __ieee754_ynl(n,x);
 | |
| # else
 | |
| 	long double z;
 | |
| 	z = __ieee754_ynl(n,x);
 | |
| 	if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
 | |
|         if(x <= 0.0){
 | |
|                 if(x==0.0)
 | |
|                     /* d= -one/(x-x); */
 | |
|                     return __kernel_standard_l((double)n,x,212);
 | |
|                 else
 | |
|                     /* d = zero/(x-x); */
 | |
|                     return __kernel_standard_l((double)n,x,213);
 | |
|         }
 | |
| 	if(x>X_TLOSS && _LIB_VERSION != _POSIX_) {
 | |
| 	    return __kernel_standard_l((double)n,x,239); /* yn(x>X_TLOSS,n) */
 | |
| 	} else
 | |
| 	    return z;
 | |
| # endif
 | |
| }
 | |
| libm_alias_ldouble (__yn, yn)
 | |
| #endif
 |