summaryrefslogtreecommitdiff
path: root/math
diff options
context:
space:
mode:
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>2016-09-08 08:48:08 -0500
committerPaul E. Murphy <murphyp@linux.vnet.ibm.com>2016-09-20 14:37:40 -0500
commit9f9834f582f87cc84bfaa11cff5f98fb661c288d (patch)
tree871f7a56da332d8fadb01fb81eae95a7ed6545c2 /math
parent8837917cf17b083ac4178352c740b0bfeada4d7f (diff)
downloadglibc-9f9834f582f87cc84bfaa11cff5f98fb661c288d.tar.gz
Make ldexpF generic.
This one is a little more tricky since it is built both for libm and libc, and exports multiple aliases. To simplify aliasing, a new macro is introduced which handles aliasing to two symbols. By default, it just applies declare_mgen_alias to both target symbols. Likewise, the makefile is tweaked a little to generate templates for shared files too, and a new rule is added to build m_*.c objects from the objpfx directory. Verified there are no symbol or code changes using a script to diff the *_ldexp* object files on s390x, aarch64, arm, x86_64, and ppc64.
Diffstat (limited to 'math')
-rw-r--r--math/Makefile20
-rw-r--r--math/s_ldexp_template.c (renamed from math/s_ldexp.c)20
-rw-r--r--math/s_ldexpf.c32
-rw-r--r--math/s_ldexpl.c33
4 files changed, 24 insertions, 81 deletions
diff --git a/math/Makefile b/math/Makefile
index fc48960fb0..367f73e227 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -120,7 +120,8 @@ libm-routines = $(strip $(libm-support) $(libm-compat-calls) \
# In libm-calls (above), list m_foo in place of s_foo for any
# routine that should be compiled separately for its libc and libm versions.
calls = s_isinfF s_isnanF s_finiteF s_copysignF s_modfF s_scalbnF s_frexpF \
- s_ldexpF s_signbitF
+ s_signbitF $(gen-calls)
+gen-calls = s_ldexpF
generated += $(foreach s,.c .S,$(call type-foreach, $(calls:s_%=m_%$(s))))
routines = $(call type-foreach, $(calls))
@@ -272,12 +273,15 @@ extra-objs += libieee.a ieee-math.o
include ../Rules
-generated += $(addsuffix .c,$(call type-foreach,$(gen-libm-calls))) \
+gen-all-calls = $(gen-libm-calls) $(gen-calls)
+
+generated += $(addsuffix .c,$(call type-foreach,$(gen-all-calls))) \
gen-libm-templates.stmp
# Create wrappers in the math build directory.
-$(objpfx)gen-libm-templates.stmp:
- for gcall in $(gen-libm-calls); do \
+$(objpfx)gen-libm-templates.stmp: Makefile
+ $(make-target-directory)
+ for gcall in $(gen-all-calls); do \
func=$${gcall%F*}$${gcall#*F}; \
for type in $(foreach t,$(types),$(t)__$(type-$(t)-suffix)); do \
suff=$${type#*__}; \
@@ -292,7 +296,7 @@ $(objpfx)gen-libm-templates.stmp:
echo > $(@)
# Add dependency to ensure the generator runs prior.
-$(foreach t, $(call type-foreach, $(gen-libm-calls)), \
+$(foreach t, $(call type-foreach, $(gen-all-calls)), \
$(objpfx)$(t).c): $(objpfx)gen-libm-templates.stmp
ifneq (no,$(PERL))
@@ -334,6 +338,12 @@ endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
+# Likewise, for those generated files shared with libc.
+define o-iterator-doit
+$(objpfx)m_%$o: $(objpfx)s_%.c $(before-compile); $$(compile-command.c)
+endef
+object-suffixes-left := $(all-object-suffixes)
+include $(o-iterator)
# This file defines the default _LIB_VERSION variable that controls
# the error return conventions for the math functions.
diff --git a/math/s_ldexp.c b/math/s_ldexp_template.c
index ee53695d71..42a83334c3 100644
--- a/math/s_ldexp.c
+++ b/math/s_ldexp_template.c
@@ -18,17 +18,15 @@ static char rcsid[] = "$NetBSD: s_ldexp.c,v 1.6 1995/05/10 20:47:40 jtc Exp $";
#include <math_private.h>
#include <errno.h>
-double __ldexp(double value, int exp)
+FLOAT
+M_SUF (__ldexp) (FLOAT value, int exp)
{
- if(!isfinite(value)||value==0.0) return value + value;
- value = __scalbn(value,exp);
- if(!isfinite(value)||value==0.0) __set_errno (ERANGE);
+ if(!isfinite(value)||value==0) return value + value;
+ value = M_SCALBN(value,exp);
+ if(!isfinite(value)||value==0) __set_errno (ERANGE);
return value;
}
-weak_alias (__ldexp, ldexp)
-weak_alias (__ldexp, scalbn)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__ldexp, __ldexpl)
-weak_alias (__ldexp, ldexpl)
-weak_alias (__ldexp, scalbnl)
-#endif
+
+declare_mgen_alias_2 (__ldexp, ldexp, scalbn);
+
+/* Note, versioning issues are punted to ldbl-opt in this case. */
diff --git a/math/s_ldexpf.c b/math/s_ldexpf.c
deleted file mode 100644
index b83062fe35..0000000000
--- a/math/s_ldexpf.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* s_ldexpf.c -- float version of s_ldexp.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@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: s_ldexpf.c,v 1.3 1995/05/10 20:47:42 jtc Exp $";
-#endif
-
-#include <math.h>
-#include <math_private.h>
-#include <errno.h>
-
-float __ldexpf(float value, int exp)
-{
- if(!isfinite(value)||value==(float)0.0) return value + value;
- value = __scalbnf(value,exp);
- if(!isfinite(value)||value==(float)0.0) __set_errno (ERANGE);
- return value;
-}
-weak_alias (__ldexpf, ldexpf)
-weak_alias (__ldexpf, scalbnf)
diff --git a/math/s_ldexpl.c b/math/s_ldexpl.c
deleted file mode 100644
index 52fb093171..0000000000
--- a/math/s_ldexpl.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* s_ldexpl.c -- long double version of s_ldexp.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
-
-#include <math.h>
-#include <math_private.h>
-#include <errno.h>
-
-long double __ldexpl(long double value, int exp)
-{
- if(!isfinite(value)||value==0.0) return value + value;
- value = __scalbnl(value,exp);
- if(!isfinite(value)||value==0.0) __set_errno (ERANGE);
- return value;
-}
-weak_alias (__ldexpl, ldexpl)
-weak_alias (__ldexpl, scalbnl)