14fff2a7eSSiva Chandra Reddy //===-- Unittests for feclearexcept, feraiseexcept and fetestexpect -------===//
24fff2a7eSSiva Chandra Reddy //
34fff2a7eSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44fff2a7eSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
54fff2a7eSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64fff2a7eSSiva Chandra Reddy //
74fff2a7eSSiva Chandra Reddy //===----------------------------------------------------------------------===//
84fff2a7eSSiva Chandra Reddy 
94fff2a7eSSiva Chandra Reddy #include "src/fenv/feclearexcept.h"
104fff2a7eSSiva Chandra Reddy #include "src/fenv/feraiseexcept.h"
114fff2a7eSSiva Chandra Reddy #include "src/fenv/fetestexcept.h"
124fff2a7eSSiva Chandra Reddy 
13*76ec69a9STue Ly #include "src/__support/FPUtil/FEnvImpl.h"
144fff2a7eSSiva Chandra Reddy #include "utils/UnitTest/Test.h"
154fff2a7eSSiva Chandra Reddy 
164fff2a7eSSiva Chandra Reddy #include <fenv.h>
174fff2a7eSSiva Chandra Reddy 
TEST(LlvmLibcExceptionStatusTest,RaiseAndTest)181df0dbfcSMichael Jones TEST(LlvmLibcExceptionStatusTest, RaiseAndTest) {
19ab3cbe4bSSiva Chandra Reddy   // This test raises a set of exceptions and checks that the exception
20ab3cbe4bSSiva Chandra Reddy   // status flags are updated. The intention is really not to invoke the
21ab3cbe4bSSiva Chandra Reddy   // exception handler. Hence, we will disable all exceptions at the
22ab3cbe4bSSiva Chandra Reddy   // beginning.
231c92911eSMichael Jones   __llvm_libc::fputil::disable_except(FE_ALL_EXCEPT);
24ab3cbe4bSSiva Chandra Reddy 
254fff2a7eSSiva Chandra Reddy   int excepts[] = {FE_DIVBYZERO, FE_INVALID, FE_INEXACT, FE_OVERFLOW,
264fff2a7eSSiva Chandra Reddy                    FE_UNDERFLOW};
27cb2e2d50SMichael Jones 
2825226f3eSMichael Jones   constexpr int ALL_EXCEPTS =
29cb2e2d50SMichael Jones       FE_DIVBYZERO | FE_INVALID | FE_INEXACT | FE_OVERFLOW | FE_UNDERFLOW;
30cb2e2d50SMichael Jones 
314fff2a7eSSiva Chandra Reddy   for (int e : excepts) {
324fff2a7eSSiva Chandra Reddy     int r = __llvm_libc::feraiseexcept(e);
33bfbbb62bSSiva Chandra Reddy     ASSERT_EQ(r, 0);
344fff2a7eSSiva Chandra Reddy     int s = __llvm_libc::fetestexcept(e);
35bfbbb62bSSiva Chandra Reddy     ASSERT_EQ(s, e);
364fff2a7eSSiva Chandra Reddy 
374fff2a7eSSiva Chandra Reddy     r = __llvm_libc::feclearexcept(e);
38bfbbb62bSSiva Chandra Reddy     ASSERT_EQ(r, 0);
394fff2a7eSSiva Chandra Reddy     s = __llvm_libc::fetestexcept(e);
40bfbbb62bSSiva Chandra Reddy     ASSERT_EQ(s, 0);
414fff2a7eSSiva Chandra Reddy   }
424fff2a7eSSiva Chandra Reddy 
434fff2a7eSSiva Chandra Reddy   for (int e1 : excepts) {
444fff2a7eSSiva Chandra Reddy     for (int e2 : excepts) {
454fff2a7eSSiva Chandra Reddy       int e = e1 | e2;
464fff2a7eSSiva Chandra Reddy       int r = __llvm_libc::feraiseexcept(e);
47bfbbb62bSSiva Chandra Reddy       ASSERT_EQ(r, 0);
484fff2a7eSSiva Chandra Reddy       int s = __llvm_libc::fetestexcept(e);
49bfbbb62bSSiva Chandra Reddy       ASSERT_EQ(s, e);
504fff2a7eSSiva Chandra Reddy 
514fff2a7eSSiva Chandra Reddy       r = __llvm_libc::feclearexcept(e);
52bfbbb62bSSiva Chandra Reddy       ASSERT_EQ(r, 0);
534fff2a7eSSiva Chandra Reddy       s = __llvm_libc::fetestexcept(e);
54bfbbb62bSSiva Chandra Reddy       ASSERT_EQ(s, 0);
554fff2a7eSSiva Chandra Reddy     }
564fff2a7eSSiva Chandra Reddy   }
574fff2a7eSSiva Chandra Reddy 
584fff2a7eSSiva Chandra Reddy   for (int e1 : excepts) {
594fff2a7eSSiva Chandra Reddy     for (int e2 : excepts) {
604fff2a7eSSiva Chandra Reddy       for (int e3 : excepts) {
614fff2a7eSSiva Chandra Reddy         int e = e1 | e2 | e3;
624fff2a7eSSiva Chandra Reddy         int r = __llvm_libc::feraiseexcept(e);
63bfbbb62bSSiva Chandra Reddy         ASSERT_EQ(r, 0);
644fff2a7eSSiva Chandra Reddy         int s = __llvm_libc::fetestexcept(e);
65bfbbb62bSSiva Chandra Reddy         ASSERT_EQ(s, e);
664fff2a7eSSiva Chandra Reddy 
674fff2a7eSSiva Chandra Reddy         r = __llvm_libc::feclearexcept(e);
68bfbbb62bSSiva Chandra Reddy         ASSERT_EQ(r, 0);
694fff2a7eSSiva Chandra Reddy         s = __llvm_libc::fetestexcept(e);
70bfbbb62bSSiva Chandra Reddy         ASSERT_EQ(s, 0);
714fff2a7eSSiva Chandra Reddy       }
724fff2a7eSSiva Chandra Reddy     }
734fff2a7eSSiva Chandra Reddy   }
744fff2a7eSSiva Chandra Reddy 
754fff2a7eSSiva Chandra Reddy   for (int e1 : excepts) {
764fff2a7eSSiva Chandra Reddy     for (int e2 : excepts) {
774fff2a7eSSiva Chandra Reddy       for (int e3 : excepts) {
784fff2a7eSSiva Chandra Reddy         for (int e4 : excepts) {
794fff2a7eSSiva Chandra Reddy           int e = e1 | e2 | e3 | e4;
804fff2a7eSSiva Chandra Reddy           int r = __llvm_libc::feraiseexcept(e);
81bfbbb62bSSiva Chandra Reddy           ASSERT_EQ(r, 0);
824fff2a7eSSiva Chandra Reddy           int s = __llvm_libc::fetestexcept(e);
83bfbbb62bSSiva Chandra Reddy           ASSERT_EQ(s, e);
844fff2a7eSSiva Chandra Reddy 
854fff2a7eSSiva Chandra Reddy           r = __llvm_libc::feclearexcept(e);
86bfbbb62bSSiva Chandra Reddy           ASSERT_EQ(r, 0);
874fff2a7eSSiva Chandra Reddy           s = __llvm_libc::fetestexcept(e);
88bfbbb62bSSiva Chandra Reddy           ASSERT_EQ(s, 0);
894fff2a7eSSiva Chandra Reddy         }
904fff2a7eSSiva Chandra Reddy       }
914fff2a7eSSiva Chandra Reddy     }
924fff2a7eSSiva Chandra Reddy   }
934fff2a7eSSiva Chandra Reddy 
944fff2a7eSSiva Chandra Reddy   for (int e1 : excepts) {
954fff2a7eSSiva Chandra Reddy     for (int e2 : excepts) {
964fff2a7eSSiva Chandra Reddy       for (int e3 : excepts) {
974fff2a7eSSiva Chandra Reddy         for (int e4 : excepts) {
984fff2a7eSSiva Chandra Reddy           for (int e5 : excepts) {
994fff2a7eSSiva Chandra Reddy             int e = e1 | e2 | e3 | e4 | e5;
1004fff2a7eSSiva Chandra Reddy             int r = __llvm_libc::feraiseexcept(e);
101bfbbb62bSSiva Chandra Reddy             ASSERT_EQ(r, 0);
1024fff2a7eSSiva Chandra Reddy             int s = __llvm_libc::fetestexcept(e);
103bfbbb62bSSiva Chandra Reddy             ASSERT_EQ(s, e);
1044fff2a7eSSiva Chandra Reddy 
1054fff2a7eSSiva Chandra Reddy             r = __llvm_libc::feclearexcept(e);
106bfbbb62bSSiva Chandra Reddy             ASSERT_EQ(r, 0);
1074fff2a7eSSiva Chandra Reddy             s = __llvm_libc::fetestexcept(e);
108bfbbb62bSSiva Chandra Reddy             ASSERT_EQ(s, 0);
1094fff2a7eSSiva Chandra Reddy           }
1104fff2a7eSSiva Chandra Reddy         }
1114fff2a7eSSiva Chandra Reddy       }
1124fff2a7eSSiva Chandra Reddy     }
1134fff2a7eSSiva Chandra Reddy   }
1144fff2a7eSSiva Chandra Reddy 
11525226f3eSMichael Jones   int r = __llvm_libc::feraiseexcept(ALL_EXCEPTS);
116bfbbb62bSSiva Chandra Reddy   ASSERT_EQ(r, 0);
11725226f3eSMichael Jones   int s = __llvm_libc::fetestexcept(ALL_EXCEPTS);
11825226f3eSMichael Jones   ASSERT_EQ(s, ALL_EXCEPTS);
1194fff2a7eSSiva Chandra Reddy }
120