1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
/* { dg-do compile { target { powerpc*-*-linux* } } } */
/* { dg-require-effective-target powerpc_float128_sw_ok } */
/* { dg-options "-O2 -mvsx" } */
#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
|