(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
builtin-ldexp-1.c
       1  /* Copyright (C) 2007  Free Software Foundation.
       2  
       3     Verify that built-in folding of ldexp et al. is correctly performed
       4     by the compiler.
       5  
       6     Origin: Kaveh R. Ghazi,  February 17, 2007.  */
       7  
       8  /* { dg-do link } */
       9  /* { dg-options "-fno-finite-math-only" { target sh*-*-* } } */
      10  /* { dg-require-effective-target inf } */
      11  /* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
      12  
      13  extern void link_error(int);
      14  
      15  /* Return TRUE if the sign of X != sign of Y.  This is important when
      16     comparing signed zeros.  */
      17  #define CKSGN_F(X,Y) \
      18    (__builtin_copysignf(1.0F,(X)) != __builtin_copysignf(1.0F,(Y)))
      19  #define CKSGN(X,Y) \
      20    (__builtin_copysign(1.0,(X)) != __builtin_copysign(1.0,(Y)))
      21  #define CKSGN_L(X,Y) \
      22    (__builtin_copysignl(1.0L,(X)) != __builtin_copysignl(1.0L,(Y)))
      23  
      24  /* Test that FUNC(ARG1,ARG2) == RES.  Check the sign for -0.0.  */
      25  #define TESTIT(FUNC,ARG1,ARG2,RES) do { \
      26    if (__builtin_##FUNC##f(ARG1##f,ARG2) != RES##f \
      27        || CKSGN_F(__builtin_##FUNC##f(ARG1##f,ARG2),RES##f)) \
      28      link_error(__LINE__); \
      29    if (__builtin_##FUNC(ARG1,ARG2) != RES \
      30        || CKSGN(__builtin_##FUNC(ARG1,ARG2),RES)) \
      31      link_error(__LINE__); \
      32    if (__builtin_##FUNC##l(ARG1##l,ARG2) != RES##l \
      33        || CKSGN_L(__builtin_##FUNC##l(ARG1##l,ARG2),RES##l)) \
      34      link_error(__LINE__); \
      35    } while (0)
      36  
      37  /* Test that (long)FUNC(ARG1,ARG2) == (long)RES.  The cast is
      38     necessary when RES is not a constant.  */
      39  #define TESTIT2(FUNC,ARG1,ARG2,RES) do { \
      40    if ((long)__builtin_##FUNC##f(ARG1##f,ARG2) != (long)RES##f) \
      41      link_error(__LINE__); \
      42    if ((long)__builtin_##FUNC(ARG1,ARG2) != (long)RES) \
      43      link_error(__LINE__); \
      44    if ((long)__builtin_##FUNC##l(ARG1##l,ARG2) != (long)RES##l) \
      45      link_error(__LINE__); \
      46    } while (0)
      47  
      48  /* Test that FUNCRES(FUNC(NEG FUNCARG(ARGARG),ARG2)) is false.  Check
      49     the sign as well.  */
      50  #define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,ARG2,FUNCRES) do { \
      51    if (!__builtin_##FUNCRES##f(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG),ARG2)) \
      52        || CKSGN_F(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG),ARG2), NEG __builtin_##FUNCARG##f(ARGARG))) \
      53      link_error(__LINE__); \
      54    if (!__builtin_##FUNCRES(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG),ARG2)) \
      55        || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG),ARG2), NEG __builtin_##FUNCARG(ARGARG))) \
      56      link_error(__LINE__); \
      57    if (!__builtin_##FUNCRES##l(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG),ARG2)) \
      58        || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG),ARG2), NEG __builtin_##FUNCARG##l(ARGARG))) \
      59      link_error(__LINE__); \
      60    } while (0)
      61  
      62  /* Using foo==MIN/MAX float values, test that FUNC(foo,EXP) == foo*exp2(EXP),
      63     and also that FUNC(foo,-EXP) == foo*exp2(-EXP).  */
      64  #define TESTIT4(FUNC,EXP) do { \
      65    if (__builtin_##FUNC##f(__FLT_MIN__,EXP) != __FLT_MIN__*__builtin_exp2f(EXP)) \
      66      link_error(__LINE__); \
      67    if (__builtin_##FUNC##f(-__FLT_MIN__,EXP) != -__FLT_MIN__*__builtin_exp2f(EXP)) \
      68      link_error(__LINE__); \
      69    if (__builtin_##FUNC(__DBL_MIN__,EXP) != __DBL_MIN__*__builtin_exp2(EXP)) \
      70      link_error(__LINE__); \
      71    if (__builtin_##FUNC(-__DBL_MIN__,EXP) != -__DBL_MIN__*__builtin_exp2(EXP)) \
      72      link_error(__LINE__); \
      73    if (__builtin_##FUNC##l(__LDBL_MIN__,EXP) != __LDBL_MIN__*__builtin_exp2l(EXP)) \
      74      link_error(__LINE__); \
      75    if (__builtin_##FUNC##l(-__LDBL_MIN__,EXP) != -__LDBL_MIN__*__builtin_exp2l(EXP)) \
      76      link_error(__LINE__); \
      77    if (__builtin_##FUNC##f(__FLT_MAX__,-EXP) != __FLT_MAX__*__builtin_exp2f(-EXP)) \
      78      link_error(__LINE__); \
      79    if (__builtin_##FUNC##f(-__FLT_MAX__,-EXP) != -__FLT_MAX__*__builtin_exp2f(-EXP)) \
      80      link_error(__LINE__); \
      81    if (__builtin_##FUNC(__DBL_MAX__,-EXP) != __DBL_MAX__*__builtin_exp2(-EXP)) \
      82      link_error(__LINE__); \
      83    if (__builtin_##FUNC(-__DBL_MAX__,-EXP) != -__DBL_MAX__*__builtin_exp2(-EXP)) \
      84      link_error(__LINE__); \
      85    if (__builtin_##FUNC##l(__LDBL_MAX__,-EXP) != __LDBL_MAX__*__builtin_exp2l(-EXP)) \
      86      link_error(__LINE__); \
      87    if (__builtin_##FUNC##l(-__LDBL_MAX__,-EXP) != -__LDBL_MAX__*__builtin_exp2l(-EXP)) \
      88      link_error(__LINE__); \
      89    } while (0)
      90  
      91  void __attribute__ ((__noinline__))
      92  foo(float xf, double x, long double xl, int i, long l)
      93  {
      94    /* f(0.0, i) -> 0.0 and f(-0.0, i) -> -0.0.  */
      95    TESTIT (ldexp, 0.0, i, 0.0);
      96    TESTIT (ldexp, -0.0, i, -0.0);
      97    TESTIT (scalbn, 0.0, i, 0.0);
      98    TESTIT (scalbn, -0.0, i, -0.0);
      99    TESTIT (scalbln, 0.0, l, 0.0);
     100    TESTIT (scalbln, -0.0, l, -0.0);
     101    
     102    /* f(x,0) -> x.  */
     103    TESTIT2 (ldexp, x, 0, x);
     104    TESTIT2 (scalbn, x, 0, x);
     105    TESTIT2 (scalbln, x, 0, x);
     106  
     107    /* f(Inf,i) -> Inf and f(NaN,i) -> NaN.  */
     108    TESTIT3 (ldexp, , inf, , i, isinf);
     109    TESTIT3 (ldexp, -, inf, , i, isinf);
     110    TESTIT3 (ldexp, , nan, "", i, isnan);
     111    TESTIT3 (ldexp, -, nan, "", i, isnan);
     112  
     113    TESTIT3 (scalbn, , inf, , i, isinf);
     114    TESTIT3 (scalbn, -, inf, , i, isinf);
     115    TESTIT3 (scalbn, , nan, "", i, isnan);
     116    TESTIT3 (scalbn, -, nan, "", i, isnan);
     117  
     118    TESTIT3 (scalbln, , inf, , i, isinf);
     119    TESTIT3 (scalbln, -, inf, , i, isinf);
     120    TESTIT3 (scalbln, , nan, "", i, isnan);
     121    TESTIT3 (scalbln, -, nan, "", i, isnan);
     122  
     123    /* Evaluate when both arguments are constant.  */
     124    TESTIT (ldexp, 5.0, 3, 40.0);
     125    TESTIT (ldexp, -5.0, 3, -40.0);
     126    TESTIT (ldexp, 5.0, -3, 0.625);
     127    TESTIT (ldexp, -5.0, -3, -0.625);
     128  
     129    TESTIT (ldexp, 1000.0, 5, 32000.0);
     130    TESTIT (ldexp, -1000.0, 5, -32000.0);
     131    TESTIT (ldexp, 1000.0, -5, 31.25);
     132    TESTIT (ldexp, -1000.0, -5, -31.25);
     133  
     134    /* f(x,N) -> x*exp2(N), using MIN/MAX constants for x and constant N.  */
     135    TESTIT4 (ldexp, 1);
     136    TESTIT4 (ldexp, 2);
     137    TESTIT4 (ldexp, 3);
     138    TESTIT4 (ldexp, 5);
     139    TESTIT4 (ldexp, 9);
     140    TESTIT4 (ldexp, 10);
     141    TESTIT4 (ldexp, 12);
     142    TESTIT4 (ldexp, 18);
     143    TESTIT4 (ldexp, 25);
     144    TESTIT4 (ldexp, 50);
     145    TESTIT4 (ldexp, 75);
     146    TESTIT4 (ldexp, 100);
     147    TESTIT4 (ldexp, 123);
     148  
     149    /* These are folded when float radix is two.  */
     150  #if __FLT_RADIX__ == 2
     151    TESTIT (scalbn, 5.0, 3, 40.0);
     152    TESTIT (scalbn, -5.0, 3, -40.0);
     153    TESTIT (scalbn, 5.0, -3, 0.625);
     154    TESTIT (scalbn, -5.0, -3, -0.625);
     155  
     156    TESTIT (scalbn, 1000.0, 5, 32000.0);
     157    TESTIT (scalbn, -1000.0, 5, -32000.0);
     158    TESTIT (scalbn, 1000.0, -5, 31.25);
     159    TESTIT (scalbn, -1000.0, -5, -31.25);
     160  
     161    TESTIT4 (scalbn, 1);
     162    TESTIT4 (scalbn, 2);
     163    TESTIT4 (scalbn, 3);
     164    TESTIT4 (scalbn, 5);
     165    TESTIT4 (scalbn, 9);
     166    TESTIT4 (scalbn, 10);
     167    TESTIT4 (scalbn, 12);
     168    TESTIT4 (scalbn, 18);
     169    TESTIT4 (scalbn, 25);
     170    TESTIT4 (scalbn, 50);
     171    TESTIT4 (scalbn, 75);
     172    TESTIT4 (scalbn, 100);
     173    TESTIT4 (scalbn, 123);
     174  
     175    TESTIT (scalbln, 5.0, 3, 40.0);
     176    TESTIT (scalbln, -5.0, 3, -40.0);
     177    TESTIT (scalbln, 5.0, -3, 0.625);
     178    TESTIT (scalbln, -5.0, -3, -0.625);
     179  
     180    TESTIT (scalbln, 1000.0, 5, 32000.0);
     181    TESTIT (scalbln, -1000.0, 5, -32000.0);
     182    TESTIT (scalbln, 1000.0, -5, 31.25);
     183    TESTIT (scalbln, -1000.0, -5, -31.25);
     184  
     185    TESTIT4 (scalbln, 1);
     186    TESTIT4 (scalbln, 2);
     187    TESTIT4 (scalbln, 3);
     188    TESTIT4 (scalbln, 5);
     189    TESTIT4 (scalbln, 9);
     190    TESTIT4 (scalbln, 10);
     191    TESTIT4 (scalbln, 12);
     192    TESTIT4 (scalbln, 18);
     193    TESTIT4 (scalbln, 25);
     194    TESTIT4 (scalbln, 50);
     195    TESTIT4 (scalbln, 75);
     196    TESTIT4 (scalbln, 100);
     197    TESTIT4 (scalbln, 123);
     198  #endif
     199  }
     200  
     201  int main()
     202  {
     203    foo (0, 0, 0, 0, 0);
     204    
     205    return 0;
     206  }