/* Copyright (C) 2002, 2003  Free Software Foundation.

   Verify that all the __builtin_ math functions are recognized
   by the compiler.

   Written by Roger Sayle, 11th July 2002.  */

/* { dg-do compile } */
/* { dg-options "" } */
/* { dg-final { scan-assembler-not "__builtin_" } } */

/* These helper macros ensure we also check the float and long double
   cases.  */

/* Test FP functions taking void.  */
#define FPTEST0(FN) \
double test_##FN(void) { return __builtin_##FN(); } \
float test_##FN##f(void) { return __builtin_##FN##f(); } \
long double test_##FN##l(void) { return __builtin_##FN##l(); } 

/* Test FP functions taking one FP argument.  */
#define FPTEST1(FN) \
double test_##FN(double x) { return __builtin_##FN(x); } \
float test_##FN##f(float x) { return __builtin_##FN##f(x); } \
long double test_##FN##l(long double x) { return __builtin_##FN##l(x); } 

/* Test FP functions taking one argument of a supplied type.  */
#define FPTEST1ARG(FN, TYPE) \
double test_##FN(TYPE x) { return __builtin_##FN(x); } \
float test_##FN##f(TYPE x) { return __builtin_##FN##f(x); } \
long double test_##FN##l(TYPE x) { return __builtin_##FN##l(x); } 

/* Test FP functions taking two arguments, the first argument is of a
   supplied type.  */
#define FPTEST2ARG1(FN, TYPE) \
double test_##FN(TYPE x, double y) { return __builtin_##FN(x, y); } \
float test_##FN##f(TYPE x, float y) { return __builtin_##FN##f(x, y); } \
long double test_##FN##l(TYPE x, long double y) { return __builtin_##FN##l(x, y); } 

/* Test FP functions taking two arguments, the second argument is of a
   supplied type.  */
#define FPTEST2ARG2(FN, TYPE) \
double test_##FN(double x, TYPE y) { return __builtin_##FN(x, y); } \
float test_##FN##f(float x, TYPE y) { return __builtin_##FN##f(x, y); } \
long double test_##FN##l(long double x, TYPE y) { return __builtin_##FN##l(x, y); } 

/* Test FP functions taking two arguments, the second argument is a
   FP pointer.  */
#define FPTEST2FPP2(FN) \
double test_##FN(double x, double *y) { return __builtin_##FN(x, y); } \
float test_##FN##f(float x, float *y) { return __builtin_##FN##f(x, y); } \
long double test_##FN##l(long double x, long double *y) { return __builtin_##FN##l(x, y); } 

/* Test FP functions taking one FP argument and a supplied return
   type.  */
#define FPTEST1RET(FN, TYPE) \
TYPE test_##FN(double x) { return __builtin_##FN(x); } \
TYPE test_##FN##f(float x) { return __builtin_##FN##f(x); } \
TYPE test_##FN##l(long double x) { return __builtin_##FN##l(x); } 

/* Test FP functions taking two FP arguments.  */
#define FPTEST2(FN) \
double test_##FN(double x, double y) { return __builtin_##FN(x, y); } \
float test_##FN##f(float x, float y) { return __builtin_##FN##f(x, y); } \
long double test_##FN##l(long double x, long double y) { return __builtin_##FN##l(x, y); } 

/* Test FP functions taking three FP arguments.  */
#define FPTEST3(FN) \
double test_##FN(double x, double y, double z) { return __builtin_##FN(x, y, z); } \
float test_##FN##f(float x, float y, float z) { return __builtin_##FN##f(x, y, z); } \
long double test_##FN##l(long double x, long double y, long double z) { return __builtin_##FN##l(x, y, z); } 

/* Test FP functions taking three arguments, two FP and the third is
   of a supplied type.  */
#define FPTEST3ARG3(FN, TYPE) \
double test_##FN(double x, double y, TYPE z) { return __builtin_##FN(x, y, z); } \
float test_##FN##f(float x, float y, TYPE z) { return __builtin_##FN##f(x, y, z); } \
long double test_##FN##l(long double x, long double y, TYPE z) { return __builtin_##FN##l(x, y, z); } 

/* Test FP functions taking three FP arguments.  The second and third
   are FP pointers.  The return type is void.  */
#define FPTEST3FPP23VOID(FN) \
double test_##FN(double x, double *y, double *z) { __builtin_##FN(x, y, z); return *y * *z; } \
float test_##FN##f(float x, float *y, float *z) { __builtin_##FN##f(x, y, z); return *y * *z; } \
long double test_##FN##l(long double x, long double *y, long double *z) { __builtin_##FN##l(x, y, z); return *y * *z; } 

/* Test Complex functions taking one Complex argument.  */
#define CPTEST1(FN) \
_Complex double test_##FN(_Complex double x) { return __builtin_##FN(x); } \
_Complex float test_##FN##f(_Complex float x) { return __builtin_##FN##f(x); } \
_Complex long double test_##FN##l(_Complex long double x) { return __builtin_##FN##l(x); } 

/* Test Complex functions taking one Complex argument and returning an FP type.  */
#define CPTEST1RETFP(FN) \
double test_##FN(_Complex double x) { return __builtin_##FN(x); } \
float test_##FN##f(_Complex float x) { return __builtin_##FN##f(x); } \
long double test_##FN##l(_Complex long double x) { return __builtin_##FN##l(x); } 

/* Test Complex functions taking two Complex arguments.  */
#define CPTEST2(FN) \
_Complex double test_##FN(_Complex double x, _Complex double y) { return __builtin_##FN(x,y); } \
_Complex float test_##FN##f(_Complex float x, _Complex float y) { return __builtin_##FN##f(x,y); } \
_Complex long double test_##FN##l(_Complex long double x, _Complex long double y) { return __builtin_##FN##l(x,y); } 


/* Keep this list sorted alphabetically by function name.  */
FPTEST1     (acos)
FPTEST1     (acosh)
FPTEST1     (asin)
FPTEST1     (asinh)
FPTEST1     (atan)
FPTEST2     (atan2)
FPTEST1     (atanh)
FPTEST1     (cbrt)
FPTEST1     (ceil)
FPTEST2     (copysign)
FPTEST1     (cos)
FPTEST1     (cosh)
FPTEST2     (drem)
FPTEST1     (erf)
FPTEST1     (erfc)
FPTEST1     (exp)
FPTEST1     (exp10)
FPTEST1     (exp2)
FPTEST1     (expm1)
FPTEST1     (fabs)
FPTEST2     (fdim)
FPTEST1     (floor)
FPTEST3     (fma)
FPTEST2     (fmax)
FPTEST2     (fmin)
FPTEST2     (fmod)
FPTEST2ARG2 (frexp, int *)
FPTEST1     (gamma)
FPTEST0     (huge_val)
FPTEST2     (hypot)
FPTEST1     (ilogb)
FPTEST0     (inf)
FPTEST1     (j0)
FPTEST1     (j1)
FPTEST2ARG1 (jn, int)
FPTEST2ARG2 (ldexp, int)
FPTEST1     (lgamma)
FPTEST1RET  (llrint, long long)
FPTEST1RET  (llround, long long)
FPTEST1     (log)
FPTEST1     (log10)
FPTEST1     (log1p)
FPTEST1     (log2)
FPTEST1     (logb)
FPTEST1RET  (lrint, long)
FPTEST1RET  (lround, long)
FPTEST2FPP2 (modf)
FPTEST1     (nearbyint)
FPTEST2     (nextafter)
FPTEST2     (nexttoward)
FPTEST2     (pow)
FPTEST1     (pow10)
FPTEST2     (remainder)
FPTEST3ARG3 (remquo, int *)
FPTEST1     (rint)
FPTEST1     (round)
FPTEST2     (scalb)
FPTEST2ARG2 (scalbln, int)
FPTEST2ARG2 (scalbn, int)
FPTEST1     (significand)
FPTEST1     (sin)
FPTEST3FPP23VOID (sincos)
FPTEST1     (sinh)
FPTEST1     (sqrt)
FPTEST1     (tan)
FPTEST1     (tanh)
FPTEST1     (tgamma)
FPTEST1     (trunc)
FPTEST1     (y0)
FPTEST1     (y1)
FPTEST2ARG1 (yn, int)

/* Keep this list sorted alphabetically by function name.  */
CPTEST1RETFP (cabs)
CPTEST1      (cacos)
CPTEST1      (cacosh)
CPTEST1RETFP (carg)
CPTEST1      (casin)
CPTEST1      (casinh)
CPTEST1      (catan)
CPTEST1      (catanh)
CPTEST1      (ccos)
CPTEST1      (ccosh)
CPTEST1      (cexp)
CPTEST1RETFP (cimag)
/*CPTEST1      (clog)*/
CPTEST1      (conj)
CPTEST2      (cpow)
CPTEST1      (cproj)
CPTEST1RETFP (creal)
CPTEST1      (csin)
CPTEST1      (csinh)
CPTEST1      (csqrt)
CPTEST1      (ctan)
CPTEST1      (ctanh)
