builtin-math-2.c

来自「用于进行gcc测试」· C语言 代码 · 共 401 行 · 第 1/2 页

C
401
字号
/* Copyright (C) 2006, 2007  Free Software Foundation.   Test things that should block GCC from optimizing compile-time   constants passed to a builtin transcendental function.   Origin: Kaveh R. Ghazi,  October 22, 2006.  *//* { dg-do compile } *//* { dg-options "-fdump-tree-original" } */extern void foof (float);extern void foo (double);extern void fool (long double);#define TESTIT(FUNC, ARG) do { \  foof (__builtin_##FUNC##f (ARG##F)); \  foo (__builtin_##FUNC (ARG)); \  fool (__builtin_##FUNC##l (ARG##L)); \} while (0)#define TESTIT2(FUNC, ARG1, ARG2) do { \  foof (__builtin_##FUNC##f (ARG1##F, ARG2##F)); \  foo (__builtin_##FUNC (ARG1, ARG2)); \  fool (__builtin_##FUNC##l (ARG1##L, ARG2##L)); \} while (0)#define TESTIT2_I1(FUNC, ARG1, ARG2) do { \  foof (__builtin_##FUNC##f (ARG1, ARG2##F)); \  foo (__builtin_##FUNC (ARG1, ARG2)); \  fool (__builtin_##FUNC##l (ARG1, ARG2##L)); \} while (0)#define TESTIT2_I2ALL(FUNC, ARGF, MAXF, ARGD, MAXD, ARGLD, MAXLD) do { \  foof (__builtin_##FUNC##f (ARGF, MAXF)); \  foo (__builtin_##FUNC (ARGD, MAXD)); \  fool (__builtin_##FUNC##l (ARGLD, MAXLD)); \} while (0)#define TESTIT2_I2(FUNC, ARG1, ARG2) do { \  foof (__builtin_##FUNC##f (ARG1##F, ARG2)); \  foo (__builtin_##FUNC (ARG1, ARG2)); \  fool (__builtin_##FUNC##l (ARG1##L, ARG2)); \} while (0)#define TESTIT_REMQUO(ARG1, ARG2) do { \  int quo; \  foof (__builtin_remquof (ARG1##F, ARG2##F, &quo)); \  foo (__builtin_remquo (ARG1, ARG2, &quo)); \  fool (__builtin_remquol (ARG1##L, ARG2##L, &quo)); \} while (0)#define TESTIT_REENT(FUNC,ARG1) do { \  int sg; \  foof (__builtin_##FUNC##f_r (ARG1##F, &sg)); \  foo (__builtin_##FUNC##_r (ARG1, &sg)); \  fool (__builtin_##FUNC##l_r (ARG1##L, &sg)); \} while (0)void bar(){  /* An argument of NaN is not evaluated at compile-time.  */#ifndef __SPU__  foof (__builtin_exp2f (__builtin_nanf("")));#endif  foo (__builtin_exp2 (__builtin_nan("")));  fool (__builtin_exp2l (__builtin_nanl("")));  /* An argument of Inf/-Inf is not evaluated at compile-time.  */#ifndef __SPU__  foof (__builtin_exp2f (__builtin_inff()));#endif  foo (__builtin_exp2 (__builtin_inf()));  fool (__builtin_exp2l (__builtin_infl()));#ifndef __SPU__  foof (__builtin_exp2f (-__builtin_inff()));#endif  foo (__builtin_exp2 (-__builtin_inf()));  fool (__builtin_exp2l (-__builtin_infl()));  /* Result overflows MPFR, which in version 2.2.x has 30 exponent bits.  */  TESTIT (exp2, 0x1p50);  /* Result underflows MPFR, which in version 2.2.x has 30 exponent bits.  */  TESTIT (exp2, -0x1p50);  /* Result overflows GCC's REAL_VALUE_TYPE, which has 26 exponent bits.  */  TESTIT (exp2, 0x1p28);  /* Result underflows GCC's REAL_VALUE_TYPE, which has 26 exponent bits.  */  TESTIT (exp2, -0x1p28);    /* Result overflows (even an extended) C double's mode.  */  TESTIT (exp2, 0x1p24);  /* Result underflows (even an extended) C double's mode.  */  TESTIT (exp2, -0x1p24);  /* Ensure that normal arguments/results are folded.  */  TESTIT (exp2, 1.5);  TESTIT (exp2, -1.5);    /* The asin arg must be [-1 ... 1] inclusive.  */  TESTIT (asin, -1.5);  TESTIT (asin, 1.5);  /* The acos arg must be [-1 ... 1] inclusive.  */  TESTIT (acos, -1.5);  TESTIT (acos, 1.5);    /* The acosh arg must be [1 ... Inf] inclusive.  */  TESTIT (acosh, 0.5);  /* The atanh arg must be [-1 ... 1] EXclusive.  */  TESTIT (atanh, -1.0);  TESTIT (atanh, 1.0);  /* The log* arg must be [0 ... Inf] EXclusive.  */  TESTIT (log, -1.0);  TESTIT (log, 0.0);  TESTIT (log, -0.0);    TESTIT (log2, -1.0);  TESTIT (log2, 0.0);  TESTIT (log2, -0.0);    TESTIT (log10, -1.0);  TESTIT (log10, 0.0);  TESTIT (log10, -0.0);    /* The log1p arg must be [-1 ... Inf] EXclusive.  */  TESTIT (log1p, -2.0);  TESTIT (log1p, -1.0);  /* The tgamma arg errors with zero or negative integers.  */  TESTIT (tgamma, 0.0);  TESTIT (tgamma, -0.0);  TESTIT (tgamma, -1.0);  TESTIT (tgamma, -2.0);  TESTIT (tgamma, -3.0);  /* An argument of NaN is not evaluated at compile-time.  */#ifndef __SPU__  foof (__builtin_powf (__builtin_nanf(""), 2.5F));#endif  foo (__builtin_pow (__builtin_nan(""), 2.5));  fool (__builtin_powl (__builtin_nanl(""), 2.5L));#ifndef __SPU__  foof (__builtin_powf (2.5F, __builtin_nanf("")));#endif  foo (__builtin_pow (2.5, __builtin_nan("")));  fool (__builtin_powl (2.5L, __builtin_nanl("")));  /* An argument of Inf/-Inf is not evaluated at compile-time.  */#ifndef __SPU__  foof (__builtin_powf (__builtin_inff(), 2.5F));#endif  foo (__builtin_pow (__builtin_inf(), 2.5));  fool (__builtin_powl (__builtin_infl(), 2.5L));#ifndef __SPU__  foof (__builtin_powf (-__builtin_inff(), 2.5F));#endif  foo (__builtin_pow (-__builtin_inf(), 2.5));  fool (__builtin_powl (-__builtin_infl(), 2.5L));#ifndef __SPU__  foof (__builtin_powf (2.5F, __builtin_inff()));#endif  foo (__builtin_pow (2.5, __builtin_inf()));  fool (__builtin_powl (2.5L, __builtin_infl()));#ifndef __SPU__  foof (__builtin_powf (2.5F, -__builtin_inff()));#endif  foo (__builtin_pow (2.5, -__builtin_inf()));  fool (__builtin_powl (2.5L, -__builtin_infl()));  /* Check for Inv/NaN return values.  */  TESTIT2 (pow, -0.0, -4.5); /* Returns Inf */  TESTIT2 (pow, 0.0, -4.5); /* Returns Inf */  TESTIT2 (pow, -3.0, -4.5); /* Returns NaN */  /* Check for overflow/underflow.  */  foof (__builtin_powf (__FLT_MAX__, 3.5F));  foo (__builtin_pow (__DBL_MAX__, 3.5));  fool (__builtin_powl (__LDBL_MAX__, 3.5L));  TESTIT2 (pow, 2.0, 0x1p50);  foof (__builtin_powf (__FLT_MAX__, -3.5F));  foo (__builtin_pow (__DBL_MAX__, -3.5));  fool (__builtin_powl (__LDBL_MAX__, -3.5L));  TESTIT2 (pow, 2.0, -0x1p50);    foof (__builtin_fmaf (__FLT_MAX__, __FLT_MAX__, 0.0F));  foof (__builtin_fmaf (__FLT_MAX__, 1.0F, __FLT_MAX__));  foof (__builtin_fmaf (__FLT_MIN__, __FLT_MIN__, 0.0F));    foo (__builtin_fma (__DBL_MAX__, __DBL_MAX__, 0.0));  foo (__builtin_fma (__DBL_MAX__, 1.0, __DBL_MAX__));  foo (__builtin_fma (__DBL_MIN__, __DBL_MIN__, 0.0));    fool (__builtin_fmal (__LDBL_MAX__, __LDBL_MAX__, 0.0L));  fool (__builtin_fmal (__LDBL_MAX__, 1.0L, __LDBL_MAX__));  fool (__builtin_fmal (__LDBL_MIN__, __LDBL_MIN__, 0.0L));  /* The sqrt arg must be [0 ... Inf] inclusive.  */  TESTIT (sqrt, -0.5);  TESTIT (sqrt, -0.0);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?