[libc-commits] [libc] 05daa3d - [libc][complex] Add cargf and carg functions to libc complex math (#204087)

via libc-commits libc-commits at lists.llvm.org
Wed Jun 24 19:07:18 PDT 2026


Author: jinge90
Date: 2026-06-25T10:07:13+08:00
New Revision: 05daa3d135f8a23e6875340938402db2c52f3688

URL: https://github.com/llvm/llvm-project/commit/05daa3d135f8a23e6875340938402db2c52f3688
DIFF: https://github.com/llvm/llvm-project/commit/05daa3d135f8a23e6875340938402db2c52f3688.diff

LOG: [libc][complex] Add cargf and carg functions to libc complex math (#204087)

This PR adds carg and cargf function to libc complex and also add test
cases to cover some special inputs.

---------

Signed-off-by: jinge90 <ge.jin at intel.com>

Added: 
    libc/src/complex/carg.h
    libc/src/complex/cargf.h
    libc/src/complex/generic/carg.cpp
    libc/src/complex/generic/cargf.cpp
    libc/test/src/complex/CArgTest.h
    libc/test/src/complex/carg_test.cpp
    libc/test/src/complex/cargf_test.cpp

Modified: 
    libc/config/baremetal/aarch64/entrypoints.txt
    libc/config/baremetal/arm/entrypoints.txt
    libc/config/baremetal/riscv/entrypoints.txt
    libc/config/darwin/aarch64/entrypoints.txt
    libc/config/linux/aarch64/entrypoints.txt
    libc/config/linux/arm/entrypoints.txt
    libc/config/linux/riscv/entrypoints.txt
    libc/config/linux/x86_64/entrypoints.txt
    libc/docs/headers/complex.rst
    libc/include/complex.yaml
    libc/src/complex/CMakeLists.txt
    libc/src/complex/generic/CMakeLists.txt
    libc/test/src/complex/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index ed419b1de5ea5..f64eb55b40acd 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -311,6 +311,8 @@ set(TARGET_LIBC_ENTRYPOINTS
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 2dde53d2374a5..55a175923faa1 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -323,6 +323,8 @@ set(TARGET_LIBC_ENTRYPOINTS
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index aa1f92a3ce6c9..201d2e9cbf97b 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -321,6 +321,8 @@ set(TARGET_LIBC_ENTRYPOINTS
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index 894d90143d09f..413534a14f34e 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -132,6 +132,8 @@ endif()
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 251913fd57b99..599ae32a35073 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -444,6 +444,8 @@ endif()
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index 805738a3a5756..d610e663229ba 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -240,6 +240,8 @@ endif()
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index a9839b44a0042..ef2d13e6d6f9e 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -448,6 +448,8 @@ endif()
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 037c8b50c352e..8046679785e68 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -514,6 +514,8 @@ endif()
 
 set(TARGET_LIBM_ENTRYPOINTS
     # complex.h entrypoints
+    libc.src.complex.carg
+    libc.src.complex.cargf
     libc.src.complex.creal
     libc.src.complex.crealf
     libc.src.complex.creall

diff  --git a/libc/docs/headers/complex.rst b/libc/docs/headers/complex.rst
index ba7d73eb499ac..1a0137d6dea51 100644
--- a/libc/docs/headers/complex.rst
+++ b/libc/docs/headers/complex.rst
@@ -51,7 +51,7 @@ Functions
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
 | csqrt     |                  |                 |                        |                      |                        | 7.3.8.3                | G.6.5.2                    |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| carg      |                  |                 |                        |                      |                        | 7.3.9.1                | N/A                        |
+| carg      | |check|          | 1 ULP           |                        |                      |                        | 7.3.9.1                | N/A                        |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
 | cimag     | |check|          | |check|         | |check|                | |check|              | |check|                | 7.3.9.2                | N/A                        |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+

diff  --git a/libc/include/complex.yaml b/libc/include/complex.yaml
index 4db42be6082da..29799799d2e6b 100644
--- a/libc/include/complex.yaml
+++ b/libc/include/complex.yaml
@@ -21,6 +21,18 @@ types:
 enums: []
 objects: []
 functions:
+  - name: carg
+    standards:
+      - stdc
+    return_type: double
+    arguments:
+      - type: _Complex double
+  - name: cargf
+    standards:
+      - stdc
+    return_type: float
+    arguments:
+      - type: _Complex float
   - name: cimag
     standards:
       - stdc

diff  --git a/libc/src/complex/CMakeLists.txt b/libc/src/complex/CMakeLists.txt
index bc66a5445d727..1ebc1e8ac6141 100644
--- a/libc/src/complex/CMakeLists.txt
+++ b/libc/src/complex/CMakeLists.txt
@@ -36,3 +36,7 @@ add_complex_entrypoint_object(cprojf)
 add_complex_entrypoint_object(cprojl)
 add_complex_entrypoint_object(cprojf16)
 add_complex_entrypoint_object(cprojf128)
+
+add_complex_entrypoint_object(carg)
+add_complex_entrypoint_object(cargf)
+

diff  --git a/libc/src/complex/carg.h b/libc/src/complex/carg.h
new file mode 100644
index 0000000000000..66b92656333fc
--- /dev/null
+++ b/libc/src/complex/carg.h
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains the declaration of carg.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CARG_H
+#define LLVM_LIBC_SRC_COMPLEX_CARG_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+double carg(_Complex double x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CARG_H

diff  --git a/libc/src/complex/cargf.h b/libc/src/complex/cargf.h
new file mode 100644
index 0000000000000..03faca6aef999
--- /dev/null
+++ b/libc/src/complex/cargf.h
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains the declaration of cargf.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CARGF_H
+#define LLVM_LIBC_SRC_COMPLEX_CARGF_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+float cargf(_Complex float x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CARGF_H

diff  --git a/libc/src/complex/generic/CMakeLists.txt b/libc/src/complex/generic/CMakeLists.txt
index f1c21e4ed7271..159118182384e 100644
--- a/libc/src/complex/generic/CMakeLists.txt
+++ b/libc/src/complex/generic/CMakeLists.txt
@@ -1,3 +1,30 @@
+add_entrypoint_object(
+  carg
+  SRCS
+    carg.cpp
+  HDRS
+    ../carg.h
+  DEPENDS
+    libc.src.__support.CPP.bit
+    libc.src.__support.common
+    libc.src.__support.complex_type
+    libc.src.__support.math.atan2
+)
+
+add_entrypoint_object(
+  cargf
+  SRCS
+    cargf.cpp
+  HDRS
+    ../cargf.h
+  DEPENDS
+    libc.src.__support.CPP.bit
+    libc.src.__support.common
+    libc.src.__support.complex_type
+    libc.src.__support.math.atan2f
+)
+
+
 add_entrypoint_object(
   cproj
   SRCS

diff  --git a/libc/src/complex/generic/carg.cpp b/libc/src/complex/generic/carg.cpp
new file mode 100644
index 0000000000000..4d5b0b9cf7f65
--- /dev/null
+++ b/libc/src/complex/generic/carg.cpp
@@ -0,0 +1,27 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains the implementation of carg.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/carg.h"
+#include "src/__support/CPP/bit.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+#include "src/__support/math/atan2.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(double, carg, (_Complex double x)) {
+  Complex<double> x_c = cpp::bit_cast<Complex<double>>(x);
+  return math::atan2(x_c.imag, x_c.real);
+}
+
+} // namespace LIBC_NAMESPACE_DECL

diff  --git a/libc/src/complex/generic/cargf.cpp b/libc/src/complex/generic/cargf.cpp
new file mode 100644
index 0000000000000..a0eb88303a0b1
--- /dev/null
+++ b/libc/src/complex/generic/cargf.cpp
@@ -0,0 +1,27 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains the implementation of cargf.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/cargf.h"
+#include "src/__support/CPP/bit.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+#include "src/__support/math/atan2f.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(float, cargf, (_Complex float x)) {
+  Complex<float> x_c = cpp::bit_cast<Complex<float>>(x);
+  return math::atan2f(x_c.imag, x_c.real);
+}
+
+} // namespace LIBC_NAMESPACE_DECL

diff  --git a/libc/test/src/complex/CArgTest.h b/libc/test/src/complex/CArgTest.h
new file mode 100644
index 0000000000000..10061aac36ebe
--- /dev/null
+++ b/libc/test/src/complex/CArgTest.h
@@ -0,0 +1,107 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains utility class to test 
diff erent flavors of carg.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TEST_SRC_COMPLEX_CARGTEST_H
+#define LLVM_LIBC_TEST_SRC_COMPLEX_CARGTEST_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 CArgTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
+
+  DECLARE_SPECIAL_CONSTANTS(FPT)
+
+public:
+  using CArgFunc = FPT (*)(CFPT);
+
+  void testZeroValues(CArgFunc func) {
+    EXPECT_FP_EQ(func(CFPT{0.0, 0.0}), zero);
+    EXPECT_FP_EQ(func(CFPT{0.0, -0.0}), neg_zero);
+    EXPECT_FP_EQ(func(CFPT{1.0, 0.0}), zero);
+    EXPECT_FP_EQ(func(CFPT{128.0, 0.0}), zero);
+    EXPECT_FP_EQ(func(CFPT{1.0, -0.0}), neg_zero);
+  }
+
+  void testInfinityValues(CArgFunc func) {
+    // carg(+inf + yi) = +0 for finite y > 0
+    EXPECT_FP_EQ(zero, func(CFPT{inf, 1.0}));
+    EXPECT_FP_EQ(zero, func(CFPT{inf, 256.0}));
+    // carg(+inf - yi) = -0 for finite y > 0
+    EXPECT_FP_EQ(neg_zero, func(CFPT{inf, -1.0}));
+    EXPECT_FP_EQ(neg_zero, func(CFPT{inf, -1024.0}));
+    // carg(+inf + 0i) = +0
+    EXPECT_FP_EQ(zero, func(CFPT{inf, 0.0}));
+    // carg(+inf - 0i) = -0
+    EXPECT_FP_EQ(neg_zero, func(CFPT{inf, -0.0}));
+
+    // carg(-inf + yi) = +pi for finite y > 0
+    EXPECT_FP_EQ(FPT(M_PI), func(CFPT{neg_inf, 1.0}));
+    EXPECT_FP_EQ(FPT(M_PI), func(CFPT{neg_inf, 64.0}));
+    // carg(-inf - yi) = -pi for finite y > 0
+    EXPECT_FP_EQ(FPT(-M_PI), func(CFPT{neg_inf, -1.0}));
+    EXPECT_FP_EQ(FPT(-M_PI), func(CFPT{neg_inf, -512.0}));
+    // carg(-inf + 0i) = +pi
+    EXPECT_FP_EQ(FPT(M_PI), func(CFPT{neg_inf, 0.0}));
+    // carg(-inf - 0i) = -pi
+    EXPECT_FP_EQ(FPT(-M_PI), func(CFPT{neg_inf, -0.0}));
+
+    // carg(x + inf*i) = +pi/2 for finite x
+    EXPECT_FP_EQ(FPT(M_PI_2), func(CFPT{1.0, inf}));
+    EXPECT_FP_EQ(FPT(M_PI_2), func(CFPT{-1.0, inf}));
+    EXPECT_FP_EQ(FPT(M_PI_2), func(CFPT{0.0, inf}));
+    EXPECT_FP_EQ(FPT(M_PI_2), func(CFPT{4.0, inf}));
+    // carg(x - inf*i) = -pi/2 for finite x
+    EXPECT_FP_EQ(FPT(-M_PI_2), func(CFPT{1.0, neg_inf}));
+    EXPECT_FP_EQ(FPT(-M_PI_2), func(CFPT{-1.0, neg_inf}));
+    EXPECT_FP_EQ(FPT(-M_PI_2), func(CFPT{0.0, neg_inf}));
+    EXPECT_FP_EQ(FPT(-M_PI_2), func(CFPT{4.0, neg_inf}));
+  }
+
+  void testNaNValues(CArgFunc func) {
+    // carg(NaN + yi) = NaN for finite y
+    EXPECT_FP_IS_NAN(func(CFPT{aNaN, 0.0}));
+    EXPECT_FP_IS_NAN(func(CFPT{aNaN, 1.0}));
+    EXPECT_FP_IS_NAN(func(CFPT{aNaN, -1.0}));
+    EXPECT_FP_IS_NAN(func(CFPT{aNaN, 512.0}));
+
+    // carg(x + NaN*i) = NaN for finite x
+    EXPECT_FP_IS_NAN(func(CFPT{0.0, aNaN}));
+    EXPECT_FP_IS_NAN(func(CFPT{1.0, aNaN}));
+    EXPECT_FP_IS_NAN(func(CFPT{-1.0, aNaN}));
+    EXPECT_FP_IS_NAN(func(CFPT{4.0, aNaN}));
+
+    // carg(NaN + NaN*i) = NaN
+    EXPECT_FP_IS_NAN(func(CFPT{aNaN, aNaN}));
+
+    // carg(+inf + NaN*i) = NaN
+    EXPECT_FP_IS_NAN(func(CFPT{inf, aNaN}));
+    // carg(-inf + NaN*i) = NaN
+    EXPECT_FP_IS_NAN(func(CFPT{neg_inf, aNaN}));
+    // carg(NaN + inf*i) = NaN
+    EXPECT_FP_IS_NAN(func(CFPT{aNaN, inf}));
+    // carg(NaN - inf*i) = NaN
+    EXPECT_FP_IS_NAN(func(CFPT{aNaN, neg_inf}));
+  }
+};
+
+#define LIST_CARG_TESTS(U, T, func)                                            \
+  using LlvmLibcCArgTest = CArgTest<U, T>;                                     \
+  TEST_F(LlvmLibcCArgTest, ZeroValues) { testZeroValues(&func); }              \
+  TEST_F(LlvmLibcCArgTest, InfinityValues) { testInfinityValues(&func); }      \
+  TEST_F(LlvmLibcCArgTest, NaNValues) { testNaNValues(&func); }
+
+#endif // LLVM_LIBC_TEST_SRC_COMPLEX_CARGTEST_H

diff  --git a/libc/test/src/complex/CMakeLists.txt b/libc/test/src/complex/CMakeLists.txt
index efd1ede63eca5..fc16cf0d92ea2 100644
--- a/libc/test/src/complex/CMakeLists.txt
+++ b/libc/test/src/complex/CMakeLists.txt
@@ -1,5 +1,31 @@
 add_custom_target(libc-complex-unittests)
 
+add_fp_unittest(
+  carg_test
+  NEED_MPC
+  SUITE
+    libc-complex-unittests
+  SRCS
+    carg_test.cpp
+  HDRS
+    CArgTest.h
+  DEPENDS
+    libc.src.complex.carg
+)
+
+add_fp_unittest(
+  cargf_test
+  NEED_MPC
+  SUITE
+    libc-complex-unittests
+  SRCS
+    cargf_test.cpp
+  HDRS
+    CArgTest.h
+  DEPENDS
+    libc.src.complex.cargf
+)
+
 add_fp_unittest(
   conj_test
   SUITE

diff  --git a/libc/test/src/complex/carg_test.cpp b/libc/test/src/complex/carg_test.cpp
new file mode 100644
index 0000000000000..94ed815642001
--- /dev/null
+++ b/libc/test/src/complex/carg_test.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains unittest for carg.
+///
+//===----------------------------------------------------------------------===//
+
+#include "CArgTest.h"
+
+#include "src/complex/carg.h"
+#include "utils/MPCWrapper/MPCUtils.h"
+
+using LlvmLibcCargMPCTest = LIBC_NAMESPACE::testing::FPTest<double>;
+
+namespace mpc = LIBC_NAMESPACE::testing::mpc;
+
+TEST_F(LlvmLibcCargMPCTest, BasicForRounding) {
+  _Complex double test_values[] = {
+      1.0 + 1.0i,  -1.0 + 1.0i, 1.0 - 1.0i,   -1.0 - 1.0i,     3.0 + 4.0i,
+      -3.0 + 4.0i, 3.0 - 4.0i,  -3.0 - 4.0i,  0.5 + 0.5i,      -0.5 + 0.5i,
+      0.5 - 0.5i,  -0.5 - 0.5i, 1.0 + 0.0i,   -1.0 + 0.0i,     0.0 + 1.0i,
+      0.0 - 1.0i,  5.0 + 12.0i, 100.0 + 1.0i, 0.001 + 1000.0i,
+  };
+  for (_Complex double val : test_values) {
+    EXPECT_MPC_MATCH_ALL_ROUNDING(mpc::Operation::Carg, val,
+                                  LIBC_NAMESPACE::carg(val), 0.5);
+  }
+}
+
+LIST_CARG_TESTS(_Complex double, double, LIBC_NAMESPACE::carg)

diff  --git a/libc/test/src/complex/cargf_test.cpp b/libc/test/src/complex/cargf_test.cpp
new file mode 100644
index 0000000000000..ba0b0e0fc2af4
--- /dev/null
+++ b/libc/test/src/complex/cargf_test.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains unittest for cargf.
+///
+//===----------------------------------------------------------------------===//
+
+#include "CArgTest.h"
+
+#include "src/complex/cargf.h"
+#include "utils/MPCWrapper/MPCUtils.h"
+
+using LlvmLibcCargfMPCTest = LIBC_NAMESPACE::testing::FPTest<float>;
+
+namespace mpc = LIBC_NAMESPACE::testing::mpc;
+
+TEST_F(LlvmLibcCargfMPCTest, BasicForRounding) {
+  _Complex float test_values[] = {
+      1.0f + 1.0fi,  -1.0f + 1.0fi,  1.0f - 1.0fi,      -1.0f - 1.0fi,
+      3.0f + 4.0fi,  -3.0f + 4.0fi,  3.0f - 4.0fi,      -3.0f - 4.0fi,
+      0.5f + 0.5fi,  -0.5f + 0.5fi,  0.5f - 0.5fi,      -0.5f - 0.5fi,
+      1.0f + 0.0fi,  -1.0f + 0.0fi,  0.0f + 1.0fi,      0.0f - 1.0fi,
+      5.0f + 12.0fi, 100.0f + 1.0fi, 0.001f + 1000.0fi,
+  };
+  for (_Complex float val : test_values) {
+    EXPECT_MPC_MATCH_ALL_ROUNDING(mpc::Operation::Carg, val,
+                                  LIBC_NAMESPACE::cargf(val), 0.5);
+  }
+}
+
+LIST_CARG_TESTS(_Complex float, float, LIBC_NAMESPACE::cargf)


        


More information about the libc-commits mailing list