diff options
Diffstat (limited to 'numpy')
| -rw-r--r-- | numpy/core/include/numpy/npy_math.h | 53 | ||||
| -rw-r--r-- | numpy/core/setup.py | 6 | ||||
| -rw-r--r-- | numpy/core/setup_common.py | 6 | ||||
| -rw-r--r-- | numpy/distutils/misc_util.py | 20 |
4 files changed, 68 insertions, 17 deletions
diff --git a/numpy/core/include/numpy/npy_math.h b/numpy/core/include/numpy/npy_math.h index a7c50f6e6..625999022 100644 --- a/numpy/core/include/numpy/npy_math.h +++ b/numpy/core/include/numpy/npy_math.h @@ -6,6 +6,9 @@ extern "C" { #endif #include <math.h> +#ifdef NPY_HAVE_CONFIG_H +#include <npy_config.h> +#endif #include <numpy/npy_common.h> /* @@ -148,33 +151,51 @@ double npy_spacing(double x); /* * IEEE 754 fpu handling. Those are guaranteed to be macros */ -#ifndef NPY_HAVE_DECL_ISNAN - #define npy_isnan(x) ((x) != (x)) + +/* use builtins to avoid function calls in tight loops + * only available if npy_config.h is available (= numpys own build) */ +#if HAVE___BUILTIN_ISNAN + #define npy_isnan(x) __builtin_isnan(x) #else - #ifdef _MSC_VER - #define npy_isnan(x) _isnan((x)) + #ifndef NPY_HAVE_DECL_ISNAN + #define npy_isnan(x) ((x) != (x)) #else - #define npy_isnan(x) isnan((x)) + #ifdef _MSC_VER + #define npy_isnan(x) _isnan((x)) + #else + #define npy_isnan(x) isnan(x) + #endif #endif #endif -#ifndef NPY_HAVE_DECL_ISFINITE - #ifdef _MSC_VER - #define npy_isfinite(x) _finite((x)) + +/* only available if npy_config.h is available (= numpys own build) */ +#if HAVE___BUILTIN_ISFINITE + #define npy_isfinite(x) __builtin_isfinite(x) +#else + #ifndef NPY_HAVE_DECL_ISFINITE + #ifdef _MSC_VER + #define npy_isfinite(x) _finite((x)) + #else + #define npy_isfinite(x) !npy_isnan((x) + (-x)) + #endif #else - #define npy_isfinite(x) !npy_isnan((x) + (-x)) + #define npy_isfinite(x) isfinite((x)) #endif -#else - #define npy_isfinite(x) isfinite((x)) #endif -#ifndef NPY_HAVE_DECL_ISINF - #define npy_isinf(x) (!npy_isfinite(x) && !npy_isnan(x)) +/* only available if npy_config.h is available (= numpys own build) */ +#if HAVE___BUILTIN_ISINF + #define npy_isinf(x) __builtin_isinf(x) #else - #ifdef _MSC_VER - #define npy_isinf(x) (!_finite((x)) && !_isnan((x))) + #ifndef NPY_HAVE_DECL_ISINF + #define npy_isinf(x) (!npy_isfinite(x) && !npy_isnan(x)) #else - #define npy_isinf(x) isinf((x)) + #ifdef _MSC_VER + #define npy_isinf(x) (!_finite((x)) && !_isnan((x))) + #else + #define npy_isinf(x) isinf((x)) + #endif #endif #endif diff --git a/numpy/core/setup.py b/numpy/core/setup.py index 437f75c7b..5a1e6cf6e 100644 --- a/numpy/core/setup.py +++ b/numpy/core/setup.py @@ -161,6 +161,10 @@ def check_math_capabilities(config, moredefs, mathlibs): check_funcs(OPTIONAL_STDFUNCS) + for f, args in OPTIONAL_INTRINSICS: + if config.check_func(f, decl=False, call=True, call_args=args): + moredefs.append((fname2def(f), 1)) + # C99 functions: float and long double versions check_funcs(C99_FUNCS_SINGLE) check_funcs(C99_FUNCS_EXTENDED) @@ -602,6 +606,8 @@ def configuration(parent_package='',top_path=None): config.add_include_dirs(join('src', 'umath')) config.add_include_dirs(join('src', 'npysort')) + config.add_define_macros([("HAVE_NPY_CONFIG_H", "1")]) + config.numpy_include_dirs.extend(config.paths('include')) deps = [join('src','npymath','_signbit.c'), diff --git a/numpy/core/setup_common.py b/numpy/core/setup_common.py index 3f705cbe4..a1a9ac9af 100644 --- a/numpy/core/setup_common.py +++ b/numpy/core/setup_common.py @@ -97,6 +97,12 @@ OPTIONAL_STDFUNCS = ["expm1", "log1p", "acosh", "asinh", "atanh", "rint", "trunc", "exp2", "log2", "hypot", "atan2", "pow", "copysign", "nextafter"] +# optional gcc compiler builtins and their call arguments +# call arguments are required as the compiler will do strict signature checking +OPTIONAL_INTRINSICS = [("__builtin_isnan", '5.'), + ("__builtin_isinf", '5.'), + ("__builtin_isfinite", '5.')] + # Subset of OPTIONAL_STDFUNCS which may alreay have HAVE_* defined by Python.h OPTIONAL_STDFUNCS_MAYBE = ["expm1", "log1p", "acosh", "atanh", "asinh", "hypot", "copysign"] diff --git a/numpy/distutils/misc_util.py b/numpy/distutils/misc_util.py index 5bd3a9086..38690aec3 100644 --- a/numpy/distutils/misc_util.py +++ b/numpy/distutils/misc_util.py @@ -671,7 +671,7 @@ class Configuration(object): _list_keys = ['packages', 'ext_modules', 'data_files', 'include_dirs', 'libraries', 'headers', 'scripts', 'py_modules', - 'installed_libraries'] + 'installed_libraries', 'define_macros'] _dict_keys = ['package_dir', 'installed_pkg_config'] _extra_keys = ['name', 'version'] @@ -1273,6 +1273,22 @@ class Configuration(object): ### XXX Implement add_py_modules + def add_define_macros(self, macros): + """Add define macros to configuration + + Add the given sequence of macro name and value duples to the beginning + of the define_macros list This list will be visible to all extension + modules of the current package. + """ + dist = self.get_distribution() + if dist is not None: + if not hasattr(dist, 'define_macros'): + dist.define_macros = [] + dist.define_macros.extend(macros) + else: + self.define_macros.extend(macros) + + def add_include_dirs(self,*paths): """Add paths to configuration include directories. @@ -1440,6 +1456,8 @@ class Configuration(object): libnames.append(libname) ext_args['libraries'] = libnames + ext_args['libraries'] + ext_args['define_macros'] = \ + self.define_macros + ext_args.get('define_macros', []) from numpy.distutils.core import Extension ext = Extension(**ext_args) |
