xref: /aosp_15_r20/external/llvm-libc/test/src/fenv/feenableexcept_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for feenableexcept  -------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/properties/architectures.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/fenv/fedisableexcept.h"
11*71db0c75SAndroid Build Coastguard Worker #include "src/fenv/feenableexcept.h"
12*71db0c75SAndroid Build Coastguard Worker #include "src/fenv/fegetexcept.h"
13*71db0c75SAndroid Build Coastguard Worker 
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FEnvSafeTest.h"
15*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
16*71db0c75SAndroid Build Coastguard Worker 
17*71db0c75SAndroid Build Coastguard Worker #include "hdr/fenv_macros.h"
18*71db0c75SAndroid Build Coastguard Worker 
19*71db0c75SAndroid Build Coastguard Worker #include "excepts.h"
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker using LlvmLibcFEnvTest = LIBC_NAMESPACE::testing::FEnvSafeTest;
22*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcFEnvTest,EnableTest)23*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcFEnvTest, EnableTest) {
24*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TARGET_ARCH_IS_ANY_ARM) ||                                    \
25*71db0c75SAndroid Build Coastguard Worker     defined(LIBC_TARGET_ARCH_IS_ANY_RISCV)
26*71db0c75SAndroid Build Coastguard Worker   // Few Arm HW implementations do not trap exceptions. We skip this test
27*71db0c75SAndroid Build Coastguard Worker   // completely on such HW.
28*71db0c75SAndroid Build Coastguard Worker   //
29*71db0c75SAndroid Build Coastguard Worker   // Whether HW supports trapping exceptions or not is deduced by enabling an
30*71db0c75SAndroid Build Coastguard Worker   // exception and reading back to see if the exception got enabled. If the
31*71db0c75SAndroid Build Coastguard Worker   // exception did not get enabled, then it means that the HW does not support
32*71db0c75SAndroid Build Coastguard Worker   // trapping exceptions.
33*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::fedisableexcept(FE_ALL_EXCEPT);
34*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::feenableexcept(FE_DIVBYZERO);
35*71db0c75SAndroid Build Coastguard Worker   if (LIBC_NAMESPACE::fegetexcept() == 0)
36*71db0c75SAndroid Build Coastguard Worker     return;
37*71db0c75SAndroid Build Coastguard Worker #endif // Architectures where exception trapping is not supported
38*71db0c75SAndroid Build Coastguard Worker 
39*71db0c75SAndroid Build Coastguard Worker   int excepts[] = {FE_DIVBYZERO, FE_INVALID, FE_INEXACT, FE_OVERFLOW,
40*71db0c75SAndroid Build Coastguard Worker                    FE_UNDERFLOW};
41*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::fedisableexcept(FE_ALL_EXCEPT);
42*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(0, LIBC_NAMESPACE::fegetexcept());
43*71db0c75SAndroid Build Coastguard Worker 
44*71db0c75SAndroid Build Coastguard Worker   for (int e : excepts) {
45*71db0c75SAndroid Build Coastguard Worker     LIBC_NAMESPACE::feenableexcept(e);
46*71db0c75SAndroid Build Coastguard Worker     ASSERT_EQ(e, LIBC_NAMESPACE::fegetexcept());
47*71db0c75SAndroid Build Coastguard Worker     LIBC_NAMESPACE::fedisableexcept(e);
48*71db0c75SAndroid Build Coastguard Worker   }
49*71db0c75SAndroid Build Coastguard Worker 
50*71db0c75SAndroid Build Coastguard Worker   for (int e1 : excepts) {
51*71db0c75SAndroid Build Coastguard Worker     for (int e2 : excepts) {
52*71db0c75SAndroid Build Coastguard Worker       LIBC_NAMESPACE::feenableexcept(e1 | e2);
53*71db0c75SAndroid Build Coastguard Worker       ASSERT_EQ(e1 | e2, LIBC_NAMESPACE::fegetexcept());
54*71db0c75SAndroid Build Coastguard Worker       LIBC_NAMESPACE::fedisableexcept(e1 | e2);
55*71db0c75SAndroid Build Coastguard Worker     }
56*71db0c75SAndroid Build Coastguard Worker   }
57*71db0c75SAndroid Build Coastguard Worker 
58*71db0c75SAndroid Build Coastguard Worker   for (int e1 : excepts) {
59*71db0c75SAndroid Build Coastguard Worker     for (int e2 : excepts) {
60*71db0c75SAndroid Build Coastguard Worker       for (int e3 : excepts) {
61*71db0c75SAndroid Build Coastguard Worker         LIBC_NAMESPACE::feenableexcept(e1 | e2 | e3);
62*71db0c75SAndroid Build Coastguard Worker         ASSERT_EQ(e1 | e2 | e3, LIBC_NAMESPACE::fegetexcept());
63*71db0c75SAndroid Build Coastguard Worker         LIBC_NAMESPACE::fedisableexcept(e1 | e2 | e3);
64*71db0c75SAndroid Build Coastguard Worker       }
65*71db0c75SAndroid Build Coastguard Worker     }
66*71db0c75SAndroid Build Coastguard Worker   }
67*71db0c75SAndroid Build Coastguard Worker 
68*71db0c75SAndroid Build Coastguard Worker   for (int e1 : excepts) {
69*71db0c75SAndroid Build Coastguard Worker     for (int e2 : excepts) {
70*71db0c75SAndroid Build Coastguard Worker       for (int e3 : excepts) {
71*71db0c75SAndroid Build Coastguard Worker         for (int e4 : excepts) {
72*71db0c75SAndroid Build Coastguard Worker           LIBC_NAMESPACE::feenableexcept(e1 | e2 | e3 | e4);
73*71db0c75SAndroid Build Coastguard Worker           ASSERT_EQ(e1 | e2 | e3 | e4, LIBC_NAMESPACE::fegetexcept());
74*71db0c75SAndroid Build Coastguard Worker           LIBC_NAMESPACE::fedisableexcept(e1 | e2 | e3 | e4);
75*71db0c75SAndroid Build Coastguard Worker         }
76*71db0c75SAndroid Build Coastguard Worker       }
77*71db0c75SAndroid Build Coastguard Worker     }
78*71db0c75SAndroid Build Coastguard Worker   }
79*71db0c75SAndroid Build Coastguard Worker 
80*71db0c75SAndroid Build Coastguard Worker   for (int e1 : excepts) {
81*71db0c75SAndroid Build Coastguard Worker     for (int e2 : excepts) {
82*71db0c75SAndroid Build Coastguard Worker       for (int e3 : excepts) {
83*71db0c75SAndroid Build Coastguard Worker         for (int e4 : excepts) {
84*71db0c75SAndroid Build Coastguard Worker           for (int e5 : excepts) {
85*71db0c75SAndroid Build Coastguard Worker             LIBC_NAMESPACE::feenableexcept(e1 | e2 | e3 | e4 | e5);
86*71db0c75SAndroid Build Coastguard Worker             ASSERT_EQ(e1 | e2 | e3 | e4 | e5, LIBC_NAMESPACE::fegetexcept());
87*71db0c75SAndroid Build Coastguard Worker             LIBC_NAMESPACE::fedisableexcept(e1 | e2 | e3 | e4 | e5);
88*71db0c75SAndroid Build Coastguard Worker           }
89*71db0c75SAndroid Build Coastguard Worker         }
90*71db0c75SAndroid Build Coastguard Worker       }
91*71db0c75SAndroid Build Coastguard Worker     }
92*71db0c75SAndroid Build Coastguard Worker   }
93*71db0c75SAndroid Build Coastguard Worker }
94