(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
builtin-feclearexcept-feraiseexcept-2.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target fenv_exceptions } */
       3  /* { dg-options "-lm -fno-builtin" } */
       4  
       5  /* This testcase ensures that the builtins are correctly expanded and match the
       6     expected result.
       7     "-fno-builtin" option is used to enable calls to libc implementation of the
       8     gcc builtins tested when not using __builtin_ prefix.
       9     The excepts parameter needs to be passed as constant to
      10     __builtin_feclearexcept and __builtin_feraiseexcept because some bultins only
      11     expand on constant input. */
      12  
      13  #include <fenv.h>
      14  
      15  #ifdef DEBUG
      16  #include <stdio.h>
      17  #define INFO(...) printf(__VA_ARGS__)
      18  #define FAIL(ret, raised, expected, excepts, excepts_str, func) \
      19          printf("ERROR [l %d] testing %s (%x): %s returned %d."  \
      20  	       " Raised except bits %x, expecected %x\n",       \
      21  	       __LINE__, excepts_str, excepts, func, ret, raised, expected)
      22  #else
      23  void abort (void);
      24  #define INFO(...)
      25  #define FAIL(ret, raised, expected, excepts, excepts_str, func) abort()
      26  #endif
      27  
      28  #define TEST(excepts)                                                          \
      29      do {                                                                       \
      30        int ret = 0;                                                             \
      31        int raised = 0;                                                          \
      32                                                                                 \
      33        INFO("test: %s (%x)\n", #excepts, excepts);                              \
      34                                                                                 \
      35        feclearexcept(FE_ALL_EXCEPT);                                            \
      36        ret = __builtin_feraiseexcept(excepts);                                  \
      37        raised = fetestexcept(FE_ALL_EXCEPT);                                    \
      38        if (ret != 0 || raised != (excepts))                                     \
      39          FAIL(ret, raised, excepts, excepts, #excepts,                          \
      40  	     "__builtin_feraiseexcept");                                       \
      41                                                                                 \
      42        feraiseexcept(FE_ALL_EXCEPT);                                            \
      43        ret = __builtin_feclearexcept(excepts);                                  \
      44        raised = fetestexcept(FE_ALL_EXCEPT);                                    \
      45        if (ret != 0 || raised != (FE_ALL_EXCEPT & ~(excepts)))                  \
      46          FAIL(ret, raised, FE_ALL_EXCEPT & ~(excepts), excepts, #excepts,       \
      47  	     "__builtin_feclearexcept");                                       \
      48      } while (0)
      49  
      50  int
      51  main ()
      52  {
      53      TEST(0);
      54      TEST(FE_ALL_EXCEPT);
      55  
      56      TEST(FE_INVALID);
      57      TEST(FE_DIVBYZERO);
      58      TEST(FE_INEXACT);
      59      TEST(FE_OVERFLOW);
      60      TEST(FE_UNDERFLOW);
      61  
      62      TEST(FE_INVALID | FE_DIVBYZERO);
      63      TEST(FE_INVALID | FE_INEXACT);
      64      TEST(FE_INVALID | FE_OVERFLOW);
      65      TEST(FE_INVALID | FE_UNDERFLOW);
      66      TEST(FE_DIVBYZERO | FE_INEXACT);
      67      TEST(FE_DIVBYZERO | FE_OVERFLOW);
      68      TEST(FE_DIVBYZERO | FE_UNDERFLOW);
      69      TEST(FE_INEXACT | FE_OVERFLOW);
      70      TEST(FE_INEXACT | FE_UNDERFLOW);
      71      TEST(FE_OVERFLOW | FE_UNDERFLOW);
      72  
      73      TEST(FE_INVALID | FE_DIVBYZERO | FE_INEXACT);
      74      TEST(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);
      75      TEST(FE_INVALID | FE_DIVBYZERO | FE_UNDERFLOW);
      76      TEST(FE_INVALID | FE_INEXACT | FE_OVERFLOW);
      77      TEST(FE_INVALID | FE_INEXACT | FE_UNDERFLOW);
      78      TEST(FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW);
      79      TEST(FE_DIVBYZERO | FE_INEXACT | FE_OVERFLOW);
      80      TEST(FE_DIVBYZERO | FE_INEXACT | FE_UNDERFLOW);
      81      TEST(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW);
      82      TEST(FE_INEXACT | FE_OVERFLOW | FE_UNDERFLOW);
      83  
      84      TEST(FE_INVALID | FE_DIVBYZERO | FE_INEXACT | FE_UNDERFLOW);
      85      TEST(FE_INVALID | FE_DIVBYZERO | FE_INEXACT | FE_OVERFLOW);
      86      TEST(FE_INVALID | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW);
      87      TEST(FE_INVALID | FE_INEXACT | FE_UNDERFLOW | FE_OVERFLOW);
      88      TEST(FE_DIVBYZERO | FE_INEXACT | FE_UNDERFLOW | FE_OVERFLOW);
      89  
      90    return 0;
      91  }