diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt index 9651939454ccc..c63d785d3fb8a 100644 --- a/libc/config/baremetal/arm/entrypoints.txt +++ b/libc/config/baremetal/arm/entrypoints.txt @@ -309,6 +309,9 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.ilogb libc.src.math.ilogbf libc.src.math.ilogbl + libc.src.math.isnan + libc.src.math.isnanf + libc.src.math.isnanl libc.src.math.ldexp libc.src.math.ldexpf libc.src.math.ldexpl diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt index 8b37acef259c4..f6df10e3e150e 100644 --- a/libc/config/baremetal/riscv/entrypoints.txt +++ b/libc/config/baremetal/riscv/entrypoints.txt @@ -304,6 +304,9 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.ilogb libc.src.math.ilogbf libc.src.math.ilogbl + libc.src.math.isnan + libc.src.math.isnanf + libc.src.math.isnanl libc.src.math.ldexp libc.src.math.ldexpf libc.src.math.ldexpl diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 940df63e3912b..fbfd33479f2bd 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -414,6 +414,9 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.ilogb libc.src.math.ilogbf libc.src.math.ilogbl + libc.src.math.isnan + libc.src.math.isnanf + libc.src.math.isnanl libc.src.math.ldexp libc.src.math.ldexpf libc.src.math.ldexpl diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 51d85eed9ff16..542b0591a54de 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -422,6 +422,9 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.ilogb libc.src.math.ilogbf libc.src.math.ilogbl + libc.src.math.isnan + libc.src.math.isnanf + libc.src.math.isnanl libc.src.math.ldexp libc.src.math.ldexpf libc.src.math.ldexpl diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 09f04fb31dfd8..0f5e1ca11f093 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -440,6 +440,9 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.ilogb libc.src.math.ilogbf libc.src.math.ilogbl + libc.src.math.isnan + libc.src.math.isnanf + libc.src.math.isnanl libc.src.math.ldexp libc.src.math.ldexpf libc.src.math.ldexpl diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index 3ab7817d8568b..3d765417d3a3c 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -113,6 +113,7 @@ add_gen_header( .llvm_libc_common_h .llvm-libc-macros.float16_macros .llvm-libc-macros.math_macros + .llvm-libc-macros.math_function_macros .llvm-libc-types.double_t .llvm-libc-types.float_t .llvm-libc-types.float128 diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index f6af11abd4dd7..7fcf7b7593088 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -117,6 +117,12 @@ add_macro_header( .limits_macros ) +add_macro_header( + math_function_macros + HDR + math-function-macros.h +) + add_macro_header( offsetof_macro HDR diff --git a/libc/include/llvm-libc-macros/math-function-macros.h b/libc/include/llvm-libc-macros/math-function-macros.h new file mode 100644 index 0000000000000..551719af2b4dd --- /dev/null +++ b/libc/include/llvm-libc-macros/math-function-macros.h @@ -0,0 +1,16 @@ +//===-- Definition of function macros from math.h -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_MATH_FUNCTION_MACROS_H +#define LLVM_LIBC_MACROS_MATH_FUNCTION_MACROS_H + +#define isfinite(x) __builtin_isfinite(x) +#define isinf(x) __builtin_isinf(x) +#define isnan(x) __builtin_isnan(x) + +#endif // LLVM_LIBC_MACROS_MATH_FUNCTION_MACROS_H diff --git a/libc/include/llvm-libc-macros/math-macros.h b/libc/include/llvm-libc-macros/math-macros.h index 47838969d59ae..bcda32a615b62 100644 --- a/libc/include/llvm-libc-macros/math-macros.h +++ b/libc/include/llvm-libc-macros/math-macros.h @@ -51,9 +51,4 @@ #define math_errhandling (MATH_ERRNO | MATH_ERREXCEPT) #endif -// TODO: Move generic functional math macros to a separate header file. -#define isfinite(x) __builtin_isfinite(x) -#define isinf(x) __builtin_isinf(x) -#define isnan(x) __builtin_isnan(x) - #endif // LLVM_LIBC_MACROS_MATH_MACROS_H diff --git a/libc/include/math.h.def b/libc/include/math.h.def index 454b8f2980514..9822d8bd7ba17 100644 --- a/libc/include/math.h.def +++ b/libc/include/math.h.def @@ -17,4 +17,7 @@ %%public_api() + +#include "llvm-libc-macros/math-function-macros.h" + #endif // LLVM_LIBC_MATH_H diff --git a/libc/spec/bsd_ext.td b/libc/spec/bsd_ext.td index 50ca8b919ff2c..4d33313521735 100644 --- a/libc/spec/bsd_ext.td +++ b/libc/spec/bsd_ext.td @@ -1,4 +1,16 @@ def BsdExtensions : StandardSpec<"BSDExtensions"> { + HeaderSpec Math = HeaderSpec< + "math.h", + [], // Macros + [], // Types + [], // Enumerations + [ + FunctionSpec<"isnan", RetValSpec, [ArgSpec]>, + FunctionSpec<"isnanf", RetValSpec, [ArgSpec]>, + FunctionSpec<"isnanl", RetValSpec, [ArgSpec]>, + ] + >; + HeaderSpec String = HeaderSpec< "string.h", [], // Macros @@ -67,6 +79,7 @@ def BsdExtensions : StandardSpec<"BSDExtensions"> { >; let Headers = [ + Math, String, Strings, SysWait, diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 0983d268bd4b8..1e7b8a2a64f8e 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -242,6 +242,10 @@ add_math_entrypoint_object(ilogbl) add_math_entrypoint_object(ilogbf16) add_math_entrypoint_object(ilogbf128) +add_math_entrypoint_object(isnan) +add_math_entrypoint_object(isnanf) +add_math_entrypoint_object(isnanl) + add_math_entrypoint_object(llogb) add_math_entrypoint_object(llogbf) add_math_entrypoint_object(llogbl) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 2e4ed8f2961da..7bf176eb26517 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -2810,6 +2810,36 @@ add_entrypoint_object( -O3 ) +add_entrypoint_object( + isnan + SRCS + isnan.cpp + HDRS + ../isnan.h + COMPILE_OPTIONS + -O3 +) + +add_entrypoint_object( + isnanf + SRCS + isnanf.cpp + HDRS + ../isnanf.h + COMPILE_OPTIONS + -O3 +) + +add_entrypoint_object( + isnanl + SRCS + isnanl.cpp + HDRS + ../isnanl.h + COMPILE_OPTIONS + -O3 +) + add_entrypoint_object( nan SRCS diff --git a/libc/src/math/generic/isnan.cpp b/libc/src/math/generic/isnan.cpp new file mode 100644 index 0000000000000..dd7eadb2a2031 --- /dev/null +++ b/libc/src/math/generic/isnan.cpp @@ -0,0 +1,16 @@ +//===-- Implementation of isnan function ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/math/isnan.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, isnan, (double x)) { return __builtin_isnan(x); } + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/math/generic/isnanf.cpp b/libc/src/math/generic/isnanf.cpp new file mode 100644 index 0000000000000..98a81b03f538a --- /dev/null +++ b/libc/src/math/generic/isnanf.cpp @@ -0,0 +1,16 @@ +//===-- Implementation of isnanf function ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/math/isnanf.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, isnanf, (float x)) { return __builtin_isnan(x); } + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/math/generic/isnanl.cpp b/libc/src/math/generic/isnanl.cpp new file mode 100644 index 0000000000000..d61bfd52f0b7d --- /dev/null +++ b/libc/src/math/generic/isnanl.cpp @@ -0,0 +1,16 @@ +//===-- Implementation of isnanl function ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/math/isnanl.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, isnanl, (long double x)) { return __builtin_isnan(x); } + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/math/isnan.h b/libc/src/math/isnan.h new file mode 100644 index 0000000000000..eda8e7eb30f39 --- /dev/null +++ b/libc/src/math/isnan.h @@ -0,0 +1,18 @@ +//===-- Implementation header for isnan -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_ISNAN_H +#define LLVM_LIBC_SRC_MATH_ISNAN_H + +namespace LIBC_NAMESPACE { + +int isnan(double x); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_ISNAN_H diff --git a/libc/src/math/isnanf.h b/libc/src/math/isnanf.h new file mode 100644 index 0000000000000..a12d39ee5af97 --- /dev/null +++ b/libc/src/math/isnanf.h @@ -0,0 +1,18 @@ +//===-- Implementation header for isnanf ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_ISNANF_H +#define LLVM_LIBC_SRC_MATH_ISNANF_H + +namespace LIBC_NAMESPACE { + +int isnanf(float x); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_ISNANF_H diff --git a/libc/src/math/isnanl.h b/libc/src/math/isnanl.h new file mode 100644 index 0000000000000..9fbfca03cb15e --- /dev/null +++ b/libc/src/math/isnanl.h @@ -0,0 +1,18 @@ +//===-- Implementation header for isnanl ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_ISNANL_H +#define LLVM_LIBC_SRC_MATH_ISNANL_H + +namespace LIBC_NAMESPACE { + +int isnanl(long double x); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_ISNANL_H