OSDN Git Service

* gcc.target/i386/sse-17.c: Include sse2-check.h.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / builtins-1.c
index 6b4044c..573a879 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002  Free Software Foundation.
+/* 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_" } } */
 
-double test1(double x) { return __builtin_sqrt(x); }
-double test2(double x) { return __builtin_cos(x); }
-double test3(double x) { return __builtin_sin(x); }
-double test4(double x) { return __builtin_exp(x); }
-double test5(double x) { return __builtin_log(x); }
+/* These helper macros ensure we also check the float and long double
+   cases.  */
 
-float test1f(float x) { return __builtin_sqrtf(x); }
-float test2f(float x) { return __builtin_cosf(x); }
-float test3f(float x) { return __builtin_sinf(x); }
-float test4f(float x) { return __builtin_expf(x); }
-float test5f(float x) { return __builtin_logf(x); }
+/* 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(); } 
 
-long double test1l(long double x) { return __builtin_sqrtl(x); }
-long double test2l(long double x) { return __builtin_cosl(x); }
-long double test3l(long double x) { return __builtin_sinl(x); }
-long double test4l(long double x) { return __builtin_expl(x); }
-long double test5l(long double x) { return __builtin_logl(x); }
+/* 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 of a
+   supplied type.  The function is named reentrant style, meaning "_r"
+   appears after the possible f/l suffix.  */
+#define FPTEST2ARG2_REENT(FN, TYPE) \
+double test_##FN##_r(double x, TYPE y) { return __builtin_##FN##_r(x, y); } \
+float test_##FN##f_r(float x, TYPE y) { return __builtin_##FN##f_r(x, y); } \
+long double test_##FN##l_r(long double x, TYPE y) { return __builtin_##FN##l_r(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)
+FPTEST2ARG2_REENT (gamma, int *) /* gamma_r */
+FPTEST0     (huge_val)
+FPTEST2     (hypot)
+FPTEST1     (ilogb)
+FPTEST0     (inf)
+FPTEST1     (j0)
+FPTEST1     (j1)
+FPTEST2ARG1 (jn, int)
+FPTEST2ARG2 (ldexp, int)
+FPTEST1     (lgamma)
+FPTEST2ARG2_REENT (lgamma, int *) /* lgamma_r */
+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)
+FPTEST1RET  (signbit, 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)