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