27 changes: 27 additions & 0 deletions libc/src/complex/crealf16.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//===-- Implementation header for crealf16 ----------------------*- 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
//
//===----------------------------------------------------------------------===//

#include "src/__support/macros/properties/complex_types.h"
#include "src/__support/macros/properties/types.h"

#if defined(LIBC_TYPES_HAS_CFLOAT16)

#ifndef LLVM_LIBC_SRC_COMPLEX_CREALF16_H
#define LLVM_LIBC_SRC_COMPLEX_CREALF16_H

#include "src/__support/macros/config.h"

namespace LIBC_NAMESPACE_DECL {

float16 crealf16(cfloat16 x);

} // namespace LIBC_NAMESPACE_DECL

#endif // LLVM_LIBC_SRC_COMPLEX_CREALF16_H

#endif // LIBC_TYPES_HAS_CFLOAT16
20 changes: 20 additions & 0 deletions libc/src/complex/creall.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//===-- Implementation header for creall ------------------------*- 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_COMPLEX_CREALL_H
#define LLVM_LIBC_SRC_COMPLEX_CREALL_H

#include "src/__support/macros/config.h"

namespace LIBC_NAMESPACE_DECL {

long double creall(_Complex long double x);

} // namespace LIBC_NAMESPACE_DECL

#endif // LLVM_LIBC_SRC_COMPLEX_CREALL_H
137 changes: 137 additions & 0 deletions libc/src/complex/generic/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
add_entrypoint_object(
creal
SRCS
creal.cpp
HDRS
../creal.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
)

add_entrypoint_object(
crealf
SRCS
crealf.cpp
HDRS
../crealf.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
)

add_entrypoint_object(
creall
SRCS
creall.cpp
HDRS
../creall.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
)

add_entrypoint_object(
crealf16
SRCS
crealf16.cpp
HDRS
../crealf16.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
libc.src.__support.macros.properties.types
libc.src.__support.macros.properties.complex_types
)

add_entrypoint_object(
crealf128
SRCS
crealf128.cpp
HDRS
../crealf128.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
libc.src.__support.macros.properties.types
libc.src.__support.macros.properties.complex_types
)

add_entrypoint_object(
cimag
SRCS
cimag.cpp
HDRS
../cimag.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
)

add_entrypoint_object(
cimagf
SRCS
cimagf.cpp
HDRS
../cimagf.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
)

add_entrypoint_object(
cimagl
SRCS
cimagl.cpp
HDRS
../cimagl.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
)

add_entrypoint_object(
cimagf16
SRCS
cimagf16.cpp
HDRS
../cimagf16.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
libc.src.__support.macros.properties.types
libc.src.__support.macros.properties.complex_types
)

add_entrypoint_object(
cimagf128
SRCS
cimagf128.cpp
HDRS
../cimagf128.h
COMPILE_OPTIONS
-O3
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
libc.src.__support.macros.properties.types
libc.src.__support.macros.properties.complex_types
)
21 changes: 21 additions & 0 deletions libc/src/complex/generic/cimag.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//===-- Implementation of cimag 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/complex/cimag.h"
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(double, cimag, (_Complex double x)) {
Complex<double> x_c = cpp::bit_cast<Complex<double>>(x);
return x_c.imag;
}

} // namespace LIBC_NAMESPACE_DECL
21 changes: 21 additions & 0 deletions libc/src/complex/generic/cimagf.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//===-- Implementation of cimagf 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/complex/cimagf.h"
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(float, cimagf, (_Complex float x)) {
Complex<float> x_c = cpp::bit_cast<Complex<float>>(x);
return x_c.imag;
}

} // namespace LIBC_NAMESPACE_DECL
25 changes: 25 additions & 0 deletions libc/src/complex/generic/cimagf128.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//===-- Implementation of cimagf128 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/complex/cimagf128.h"
#if defined(LIBC_TYPES_HAS_CFLOAT128)

#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(float128, cimagf128, (cfloat128 x)) {
Complex<float128> x_c = cpp::bit_cast<Complex<float128>>(x);
return x_c.imag;
}

} // namespace LIBC_NAMESPACE_DECL

#endif // LIBC_TYPES_HAS_CFLOAT128
25 changes: 25 additions & 0 deletions libc/src/complex/generic/cimagf16.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//===-- Implementation of cimagf16 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/complex/cimagf16.h"
#if defined(LIBC_TYPES_HAS_CFLOAT16)

#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(float16, cimagf16, (cfloat16 x)) {
Complex<float16> x_c = cpp::bit_cast<Complex<float16>>(x);
return x_c.imag;
}

} // namespace LIBC_NAMESPACE_DECL

#endif // LIBC_TYPES_HAS_CFLOAT16
21 changes: 21 additions & 0 deletions libc/src/complex/generic/cimagl.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//===-- Implementation of cimagl 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/complex/cimagl.h"
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(long double, cimagl, (_Complex long double x)) {
Complex<long double> x_c = cpp::bit_cast<Complex<long double>>(x);
return x_c.imag;
}

} // namespace LIBC_NAMESPACE_DECL
21 changes: 21 additions & 0 deletions libc/src/complex/generic/creal.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//===-- Implementation of creal 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/complex/creal.h"
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(double, creal, (_Complex double x)) {
Complex<double> x_c = cpp::bit_cast<Complex<double>>(x);
return x_c.real;
}

} // namespace LIBC_NAMESPACE_DECL
21 changes: 21 additions & 0 deletions libc/src/complex/generic/crealf.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//===-- Implementation of crealf 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/complex/crealf.h"
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(float, crealf, (_Complex float x)) {
Complex<float> x_c = cpp::bit_cast<Complex<float>>(x);
return x_c.real;
}

} // namespace LIBC_NAMESPACE_DECL
25 changes: 25 additions & 0 deletions libc/src/complex/generic/crealf128.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//===-- Implementation of crealf128 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/complex/crealf128.h"
#if defined(LIBC_TYPES_HAS_CFLOAT128)

#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(float128, crealf128, (cfloat128 x)) {
Complex<float128> x_c = cpp::bit_cast<Complex<float128>>(x);
return x_c.real;
}

} // namespace LIBC_NAMESPACE_DECL

#endif // LIBC_TYPES_HAS_CFLOAT128
25 changes: 25 additions & 0 deletions libc/src/complex/generic/crealf16.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//===-- Implementation of crealf16 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/complex/crealf16.h"
#if defined(LIBC_TYPES_HAS_CFLOAT16)

#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(float16, crealf16, (cfloat16 x)) {
Complex<float16> x_c = cpp::bit_cast<Complex<float16>>(x);
return x_c.real;
}

} // namespace LIBC_NAMESPACE_DECL

#endif // LIBC_TYPES_HAS_CFLOAT16
21 changes: 21 additions & 0 deletions libc/src/complex/generic/creall.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//===-- Implementation of creall 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/complex/creall.h"
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"

namespace LIBC_NAMESPACE_DECL {

LLVM_LIBC_FUNCTION(long double, creall, (_Complex long double x)) {
Complex<long double> x_c = cpp::bit_cast<Complex<long double>>(x);
return x_c.real;
}

} // namespace LIBC_NAMESPACE_DECL
1 change: 1 addition & 0 deletions libc/test/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ function(add_fp_unittest name)
endfunction(add_fp_unittest)

add_subdirectory(__support)
add_subdirectory(complex)
add_subdirectory(ctype)
add_subdirectory(errno)
add_subdirectory(fenv)
Expand Down
74 changes: 74 additions & 0 deletions libc/test/src/complex/CImagTest.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
//===-- Utility class to test different flavors of cimag --------*- 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_TEST_SRC_COMPLEX_CIMAGTEST_H
#define LLVM_LIBC_TEST_SRC_COMPLEX_CIMAGTEST_H

#include "test/UnitTest/FEnvSafeTest.h"
#include "test/UnitTest/FPMatcher.h"
#include "test/UnitTest/Test.h"

#include "hdr/math_macros.h"

template <typename CFPT, typename FPT>
class CImagTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {

DECLARE_SPECIAL_CONSTANTS(FPT)

public:
typedef FPT (*CImagFunc)(CFPT);

void testSpecialNumbers(CImagFunc func) {
EXPECT_FP_EQ(func(CFPT(67.123 + aNaN * 1.0i)), aNaN);
EXPECT_FP_EQ(func(CFPT(78.319 + neg_aNaN * 1.0i)), neg_aNaN);
EXPECT_FP_EQ(func(CFPT(7813.131 + sNaN * 1.0i)), sNaN);
EXPECT_FP_EQ(func(CFPT(7824.152 + neg_sNaN * 1.0i)), neg_sNaN);
EXPECT_FP_EQ(func(CFPT(9024.2442 + inf * 1.0i)), inf);
EXPECT_FP_EQ(func(CFPT(8923.124 + neg_inf * 1.0i)), neg_inf);
EXPECT_FP_EQ(func(CFPT(782.124 + min_normal * 1.0i)), min_normal);
EXPECT_FP_EQ(func(CFPT(2141.2352 + max_normal * 1.0i)), max_normal);
EXPECT_FP_EQ(func(CFPT(341.134 + neg_max_normal * 1.0i)), neg_max_normal);
EXPECT_FP_EQ(func(CFPT(781.142 + min_denormal * 1.0i)), min_denormal);
EXPECT_FP_EQ(func(CFPT(781.134 + neg_min_denormal * 1.0i)),
neg_min_denormal);
EXPECT_FP_EQ(func(CFPT(1241.112 + max_denormal * 1.0i)), max_denormal);
EXPECT_FP_EQ(func(CFPT(121.121 + zero * 1.0i)), zero);
EXPECT_FP_EQ(func(CFPT(neg_zero + zero * 1.0i)), zero);
EXPECT_FP_EQ(func(CFPT(neg_zero + neg_zero * 1.0i)), neg_zero);
EXPECT_FP_EQ(func(CFPT(zero + neg_zero * 1.0i)), neg_zero);
}

void testRoundedNumbers(CImagFunc func) {
EXPECT_FP_EQ(func((CFPT)(4523.1413 + 12413.1414i)), (FPT)(12413.1414));
EXPECT_FP_EQ(func((CFPT)(-4523.1413 + 12413.1414i)), (FPT)(12413.1414));
EXPECT_FP_EQ(func((CFPT)(4523.1413 - 12413.1414i)), (FPT)(-12413.1414));
EXPECT_FP_EQ(func((CFPT)(-4523.1413 - 12413.1414i)), (FPT)(-12413.1414));

EXPECT_FP_EQ(func((CFPT)(3210.5678 + 9876.5432i)), (FPT)(9876.5432));
EXPECT_FP_EQ(func((CFPT)(-3210.5678 + 9876.5432i)), (FPT)(9876.5432));
EXPECT_FP_EQ(func((CFPT)(3210.5678 - 9876.5432i)), (FPT)(-9876.5432));
EXPECT_FP_EQ(func((CFPT)(-3210.5678 - 9876.5432i)), (FPT)(-9876.5432));

EXPECT_FP_EQ(func((CFPT)(1234.4321 + 4321.1234i)), (FPT)(4321.1234));
EXPECT_FP_EQ(func((CFPT)(-1234.4321 + 4321.1234i)), (FPT)(4321.1234));
EXPECT_FP_EQ(func((CFPT)(1234.4321 - 4321.1234i)), (FPT)(-4321.1234));
EXPECT_FP_EQ(func((CFPT)(-1234.4321 - 4321.1234i)), (FPT)(-4321.1234));

EXPECT_FP_EQ(func((CFPT)(6789.1234 + 8765.6789i)), (FPT)(8765.6789));
EXPECT_FP_EQ(func((CFPT)(-6789.1234 + 8765.6789i)), (FPT)(8765.6789));
EXPECT_FP_EQ(func((CFPT)(6789.1234 - 8765.6789i)), (FPT)(-8765.6789));
EXPECT_FP_EQ(func((CFPT)(-6789.1234 - 8765.6789i)), (FPT)(-8765.6789));
}
};

#define LIST_CIMAG_TESTS(U, T, func) \
using LlvmLibcCImagTest = CImagTest<U, T>; \
TEST_F(LlvmLibcCImagTest, SpecialNumbers) { testSpecialNumbers(&func); } \
TEST_F(LlvmLibcCImagTest, RoundedNumbers) { testRoundedNumbers(&func); }

#endif // LLVM_LIBC_TEST_SRC_COMPLEX_CIMAGTEST_H
121 changes: 121 additions & 0 deletions libc/test/src/complex/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
add_custom_target(libc-complex-unittests)

add_libc_test(
creal_test
SUITE
libc-complex-unittests
SRCS
creal_test.cpp
DEPENDS
libc.src.complex.creal
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
crealf_test
SUITE
libc-complex-unittests
SRCS
crealf_test.cpp
DEPENDS
libc.src.complex.crealf
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
creall_test
SUITE
libc-complex-unittests
SRCS
creall_test.cpp
DEPENDS
libc.src.complex.creall
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
crealf16_test
SUITE
libc-complex-unittests
SRCS
crealf16_test.cpp
DEPENDS
libc.src.complex.crealf16
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
crealf128_test
SUITE
libc-complex-unittests
SRCS
crealf128_test.cpp
DEPENDS
libc.src.complex.crealf128
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
cimag_test
SUITE
libc-complex-unittests
SRCS
cimag_test.cpp
DEPENDS
libc.src.complex.cimag
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
cimagf_test
SUITE
libc-complex-unittests
SRCS
cimagf_test.cpp
DEPENDS
libc.src.complex.cimagf
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
cimagl_test
SUITE
libc-complex-unittests
SRCS
cimagl_test.cpp
DEPENDS
libc.src.complex.cimagl
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
cimagf16_test
SUITE
libc-complex-unittests
SRCS
cimagf16_test.cpp
DEPENDS
libc.src.complex.cimagf16
LINK_LIBRARIES
LibcFPTestHelpers
)

add_libc_test(
cimagf128_test
SUITE
libc-complex-unittests
SRCS
cimagf128_test.cpp
DEPENDS
libc.src.complex.cimagf128
LINK_LIBRARIES
LibcFPTestHelpers
)
72 changes: 72 additions & 0 deletions libc/test/src/complex/CRealTest.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
//===-- Utility class to test different flavors of creal --------*- 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_TEST_SRC_COMPLEX_CREALTEST_H
#define LLVM_LIBC_TEST_SRC_COMPLEX_CREALTEST_H

#include "test/UnitTest/FEnvSafeTest.h"
#include "test/UnitTest/FPMatcher.h"
#include "test/UnitTest/Test.h"

#include "hdr/math_macros.h"

template <typename CFPT, typename FPT>
class CRealTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {

DECLARE_SPECIAL_CONSTANTS(FPT)

public:
typedef FPT (*CRealFunc)(CFPT);

void testSpecialNumbers(CRealFunc func) {
EXPECT_FP_EQ(func(CFPT(aNaN + 67.123i)), aNaN);
EXPECT_FP_EQ(func(CFPT(neg_aNaN + 78.319i)), neg_aNaN);
EXPECT_FP_EQ(func(CFPT(sNaN + 7813.131i)), sNaN);
EXPECT_FP_EQ(func(CFPT(neg_sNaN + 7824.152i)), neg_sNaN);
EXPECT_FP_EQ(func(CFPT(inf + 9024.2442i)), inf);
EXPECT_FP_EQ(func(CFPT(neg_inf + 8923.124i)), neg_inf);
EXPECT_FP_EQ(func(CFPT(min_normal + 782.124i)), min_normal);
EXPECT_FP_EQ(func(CFPT(max_normal + 2141.2352i)), max_normal);
EXPECT_FP_EQ(func(CFPT(neg_max_normal + 341.134i)), neg_max_normal);
EXPECT_FP_EQ(func(CFPT(min_denormal + 781.142i)), min_denormal);
EXPECT_FP_EQ(func(CFPT(neg_min_denormal + 781.134i)), neg_min_denormal);
EXPECT_FP_EQ(func(CFPT(max_denormal + 1241.112i)), max_denormal);
EXPECT_FP_EQ(func(CFPT(zero + 121.121i)), zero);
EXPECT_FP_EQ(func(CFPT(neg_zero + neg_zero * 1.0i)), neg_zero);
EXPECT_FP_EQ(func(CFPT(neg_zero + zero * 1.0i)), zero);
}

void testRoundedNumbers(CRealFunc func) {
EXPECT_FP_EQ(func((CFPT)(4523.1413 + 12413.1414i)), (FPT)(4523.1413));
EXPECT_FP_EQ(func((CFPT)(-4523.1413 + 12413.1414i)), (FPT)(-4523.1413));
EXPECT_FP_EQ(func((CFPT)(4523.1413 - 12413.1414i)), (FPT)(4523.1413));
EXPECT_FP_EQ(func((CFPT)(-4523.1413 - 12413.1414i)), (FPT)(-4523.1413));

EXPECT_FP_EQ(func((CFPT)(3210.5678 + 9876.5432i)), (FPT)(3210.5678));
EXPECT_FP_EQ(func((CFPT)(-3210.5678 + 9876.5432i)), (FPT)(-3210.5678));
EXPECT_FP_EQ(func((CFPT)(3210.5678 - 9876.5432i)), (FPT)(3210.5678));
EXPECT_FP_EQ(func((CFPT)(-3210.5678 - 9876.5432i)), (FPT)(-3210.5678));

EXPECT_FP_EQ(func((CFPT)(1234.4321 + 4321.1234i)), (FPT)(1234.4321));
EXPECT_FP_EQ(func((CFPT)(-1234.4321 + 4321.1234i)), (FPT)(-1234.4321));
EXPECT_FP_EQ(func((CFPT)(1234.4321 - 4321.1234i)), (FPT)(1234.4321));
EXPECT_FP_EQ(func((CFPT)(-1234.4321 - 4321.1234i)), (FPT)(-1234.4321));

EXPECT_FP_EQ(func((CFPT)(6789.1234 + 8765.6789i)), (FPT)(6789.1234));
EXPECT_FP_EQ(func((CFPT)(-6789.1234 + 8765.6789i)), (FPT)(-6789.1234));
EXPECT_FP_EQ(func((CFPT)(6789.1234 - 8765.6789i)), (FPT)(6789.1234));
EXPECT_FP_EQ(func((CFPT)(-6789.1234 - 8765.6789i)), (FPT)(-6789.1234));
}
};

#define LIST_CREAL_TESTS(U, T, func) \
using LlvmLibcCRealTest = CRealTest<U, T>; \
TEST_F(LlvmLibcCRealTest, SpecialNumbers) { testSpecialNumbers(&func); } \
TEST_F(LlvmLibcCRealTest, RoundedNumbers) { testRoundedNumbers(&func); }

#endif // LLVM_LIBC_TEST_SRC_COMPLEX_CREALTEST_H
13 changes: 13 additions & 0 deletions libc/test/src/complex/cimag_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for cimag -----------------------------------------------===//
//
// 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 "CImagTest.h"

#include "src/complex/cimag.h"

LIST_CIMAG_TESTS(_Complex double, double, LIBC_NAMESPACE::cimag)
17 changes: 17 additions & 0 deletions libc/test/src/complex/cimagf128_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//===-- Unittests for cimagf128 -------------------------------------------===//
//
// 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 "CImagTest.h"

#include "src/complex/cimagf128.h"

#if defined(LIBC_TYPES_HAS_CFLOAT128)

LIST_CIMAG_TESTS(cfloat128, float128, LIBC_NAMESPACE::cimagf128)

#endif // LIBC_TYPES_HAS_CFLOAT128
17 changes: 17 additions & 0 deletions libc/test/src/complex/cimagf16_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//===-- Unittests for cimagf16 --------------------------------------------===//
//
// 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 "CImagTest.h"

#include "src/complex/cimagf16.h"

#if defined(LIBC_TYPES_HAS_CFLOAT16)

LIST_CIMAG_TESTS(cfloat16, float16, LIBC_NAMESPACE::cimagf16)

#endif // LIBC_TYPES_HAS_CFLOAT16
13 changes: 13 additions & 0 deletions libc/test/src/complex/cimagf_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for cimagf ----------------------------------------------===//
//
// 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 "CImagTest.h"

#include "src/complex/cimagf.h"

LIST_CIMAG_TESTS(_Complex float, float, LIBC_NAMESPACE::cimagf)
13 changes: 13 additions & 0 deletions libc/test/src/complex/cimagl_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for cimagl ----------------------------------------------===//
//
// 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 "CImagTest.h"

#include "src/complex/cimagl.h"

LIST_CIMAG_TESTS(_Complex long double, long double, LIBC_NAMESPACE::cimagl)
13 changes: 13 additions & 0 deletions libc/test/src/complex/creal_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for creal -----------------------------------------------===//
//
// 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 "CRealTest.h"

#include "src/complex/creal.h"

LIST_CREAL_TESTS(_Complex double, double, LIBC_NAMESPACE::creal)
17 changes: 17 additions & 0 deletions libc/test/src/complex/crealf128_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//===-- Unittests for crealf128 -------------------------------------------===//
//
// 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 "CRealTest.h"

#include "src/complex/crealf128.h"

#if defined(LIBC_TYPES_HAS_CFLOAT128)

LIST_CREAL_TESTS(cfloat128, float128, LIBC_NAMESPACE::crealf128)

#endif // LIBC_TYPES_HAS_CFLOAT128
17 changes: 17 additions & 0 deletions libc/test/src/complex/crealf16_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//===-- Unittests for crealf16 --------------------------------------------===//
//
// 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 "CRealTest.h"

#include "src/complex/crealf16.h"

#if defined(LIBC_TYPES_HAS_CFLOAT16)

LIST_CREAL_TESTS(cfloat16, float16, LIBC_NAMESPACE::crealf16)

#endif // LIBC_TYPES_HAS_CFLOAT16
13 changes: 13 additions & 0 deletions libc/test/src/complex/crealf_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for crealf ----------------------------------------------===//
//
// 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 "CRealTest.h"

#include "src/complex/crealf.h"

LIST_CREAL_TESTS(_Complex float, float, LIBC_NAMESPACE::crealf)
13 changes: 13 additions & 0 deletions libc/test/src/complex/creall_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for creall ----------------------------------------------===//
//
// 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 "CRealTest.h"

#include "src/complex/creall.h"

LIST_CREAL_TESTS(_Complex long double, long double, LIBC_NAMESPACE::creall)