Viewing file: float128-complex-2.c (3.66 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do compile { target { powerpc*-*-linux* } } } */ /* { dg-require-effective-target powerpc_float128_hw_ok } */ /* { dg-options "-O2 -mpower9-vector -mfloat128-hardware" } */
#ifndef NO_FLOAT typedef _Complex float float_complex; extern float_complex cfloat1 (void); extern float_complex cfloat2 (void);
#define FLOAT_ARG(NAME, OP) ARG_OP(float, float_complex, NAME, OP) #define FLOAT_PTR(NAME, OP) PTR_OP(float, float_complex, NAME, OP) #define FLOAT_CALL() CALL_OP(float, float_complex, cfloat1, cfloat2)
#else #define FLOAT_ARG(NAME, OP) #define FLOAT_PTR(NAME, OP) #define FLOAT_CALL() #endif
#ifndef NO_DOUBLE typedef _Complex double double_complex; extern double_complex cdouble1 (void); extern double_complex cdouble2 (void);
#define DOUBLE_ARG(NAME, OP) ARG_OP(double, double_complex, NAME, OP) #define DOUBLE_PTR(NAME, OP) PTR_OP(double, double_complex, NAME, OP) #define DOUBLE_CALL() CALL_OP(double, double_complex, cdouble1, cdouble2)
#else #define DOUBLE_ARG(NAME, OP) #define DOUBLE_PTR(NAME, OP) #define DOUBLE_CALL() #endif
#ifndef NO_FLOAT128 #ifdef __VSX__ typedef _Complex float __attribute__((mode(KC))) float128_complex; #else typedef _Complex float __attribute__((mode(TC))) float128_complex; #endif
extern float128_complex cfloat128_1 (void); extern float128_complex cfloat128_2 (void);
#define FLOAT128_ARG(NAME, OP) ARG_OP(float128, float128_complex, NAME, OP) #define FLOAT128_PTR(NAME, OP) PTR_OP(float128, float128_complex, NAME, OP) #define FLOAT128_CALL() CALL_OP(float128, float128_complex, cfloat128_1, cfloat128_2)
#else #define FLOAT128_ARG(NAME, OP) #define FLOAT128_PTR(NAME, OP) #define FLOAT128_CALL() #endif
#ifndef NO_LDOUBLE typedef _Complex long double ldouble_complex; extern ldouble_complex cldouble1 (void); extern ldouble_complex cldouble2 (void);
#define LDOUBLE_ARG(NAME, OP) ARG_OP(ldouble, ldouble_complex, NAME, OP) #define LDOUBLE_PTR(NAME, OP) PTR_OP(ldouble, ldouble_complex, NAME, OP) #define LDOUBLE_CALL() CALL_OP(ldouble, ldouble_complex, cldouble1, cldouble2)
#else #define LDOUBLE_ARG(NAME, OP) #define LDOUBLE_PTR(NAME, OP) #define LDOUBLE_CALL() #endif
#define ARG_OP(SUFFIX, TYPE, NAME, OP) \ TYPE arg_ ## NAME ## _ ## SUFFIX (TYPE a, TYPE b) \ { \ return a OP b; \ }
#define PTR_OP(SUFFIX, TYPE, NAME, OP) \ void ptr_ ## NAME ## _ ## SUFFIX (TYPE *p, TYPE *a, TYPE *b) \ { \ *p = *a OP *b; \ }
#define CALL_OP(SUFFIX, TYPE, FUNC1, FUNC2) \ TYPE call_ ## SUFFIX (void) \ { \ TYPE value1 = FUNC1 (); \ TYPE value2 = FUNC2 (); \ return value1 + value2; \ }
#ifndef NO_ARG #ifndef NO_ADD FLOAT_ARG (add, +) DOUBLE_ARG (add, +) FLOAT128_ARG (add, +) LDOUBLE_ARG (add, +) #endif
#ifndef NO_SUB FLOAT_ARG (sub, -) DOUBLE_ARG (sub, -) FLOAT128_ARG (sub, -) LDOUBLE_ARG (sub, -) #endif
#ifndef NO_MUL FLOAT_ARG (mul, *) DOUBLE_ARG (mul, *) FLOAT128_ARG (mul, *) LDOUBLE_ARG (mul, *) #endif
#ifndef NO_DIV FLOAT_ARG (div, /) DOUBLE_ARG (div, /) FLOAT128_ARG (div, /) LDOUBLE_ARG (div, /) #endif #endif
#ifndef NO_PTR #ifndef NO_ADD FLOAT_PTR (add, +) DOUBLE_PTR (add, +) FLOAT128_PTR (add, +) LDOUBLE_PTR (add, +) #endif
#ifndef NO_SUB FLOAT_PTR (sub, -) DOUBLE_PTR (sub, -) FLOAT128_PTR (sub, -) LDOUBLE_PTR (sub, -) #endif
#ifndef NO_MUL FLOAT_PTR (mul, *) DOUBLE_PTR (mul, *) FLOAT128_PTR (mul, *) LDOUBLE_PTR (mul, *) #endif
#ifndef NO_DIV FLOAT_PTR (div, /) DOUBLE_PTR (div, /) FLOAT128_PTR (div, /) LDOUBLE_PTR (div, /) #endif #endif
#ifndef NO_CALL FLOAT_CALL () DOUBLE_CALL () FLOAT128_CALL () LDOUBLE_CALL () #endif
/* { dg-final { scan-assembler "xsaddqp" } } */ /* { dg-final { scan-assembler "xssubqp" } } */
|