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 + -
显示快捷键?