[RS6000] Tests that use int128_t and -m32
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / float128-complex-2.c
blob01f45b1ad981a6a8823d018da269225420867da4
1 /* { dg-do compile { target { powerpc*-*-linux* } } } */
2 /* { dg-require-effective-target powerpc_float128_hw_ok } */
3 /* { dg-options "-O2 -mpower9-vector -mfloat128-hardware" } */
5 #ifndef NO_FLOAT
6 typedef _Complex float float_complex;
7 extern float_complex cfloat1 (void);
8 extern float_complex cfloat2 (void);
10 #define FLOAT_ARG(NAME, OP) ARG_OP(float, float_complex, NAME, OP)
11 #define FLOAT_PTR(NAME, OP) PTR_OP(float, float_complex, NAME, OP)
12 #define FLOAT_CALL() CALL_OP(float, float_complex, cfloat1, cfloat2)
14 #else
15 #define FLOAT_ARG(NAME, OP)
16 #define FLOAT_PTR(NAME, OP)
17 #define FLOAT_CALL()
18 #endif
20 #ifndef NO_DOUBLE
21 typedef _Complex double double_complex;
22 extern double_complex cdouble1 (void);
23 extern double_complex cdouble2 (void);
25 #define DOUBLE_ARG(NAME, OP) ARG_OP(double, double_complex, NAME, OP)
26 #define DOUBLE_PTR(NAME, OP) PTR_OP(double, double_complex, NAME, OP)
27 #define DOUBLE_CALL() CALL_OP(double, double_complex, cdouble1, cdouble2)
29 #else
30 #define DOUBLE_ARG(NAME, OP)
31 #define DOUBLE_PTR(NAME, OP)
32 #define DOUBLE_CALL()
33 #endif
35 #ifndef NO_FLOAT128
36 #ifdef __VSX__
37 typedef _Complex float __attribute__((mode(KC))) float128_complex;
38 #else
39 typedef _Complex float __attribute__((mode(TC))) float128_complex;
40 #endif
42 extern float128_complex cfloat128_1 (void);
43 extern float128_complex cfloat128_2 (void);
45 #define FLOAT128_ARG(NAME, OP) ARG_OP(float128, float128_complex, NAME, OP)
46 #define FLOAT128_PTR(NAME, OP) PTR_OP(float128, float128_complex, NAME, OP)
47 #define FLOAT128_CALL() CALL_OP(float128, float128_complex, cfloat128_1, cfloat128_2)
49 #else
50 #define FLOAT128_ARG(NAME, OP)
51 #define FLOAT128_PTR(NAME, OP)
52 #define FLOAT128_CALL()
53 #endif
55 #ifndef NO_LDOUBLE
56 typedef _Complex long double ldouble_complex;
57 extern ldouble_complex cldouble1 (void);
58 extern ldouble_complex cldouble2 (void);
60 #define LDOUBLE_ARG(NAME, OP) ARG_OP(ldouble, ldouble_complex, NAME, OP)
61 #define LDOUBLE_PTR(NAME, OP) PTR_OP(ldouble, ldouble_complex, NAME, OP)
62 #define LDOUBLE_CALL() CALL_OP(ldouble, ldouble_complex, cldouble1, cldouble2)
64 #else
65 #define LDOUBLE_ARG(NAME, OP)
66 #define LDOUBLE_PTR(NAME, OP)
67 #define LDOUBLE_CALL()
68 #endif
71 #define ARG_OP(SUFFIX, TYPE, NAME, OP) \
72 TYPE arg_ ## NAME ## _ ## SUFFIX (TYPE a, TYPE b) \
73 { \
74 return a OP b; \
77 #define PTR_OP(SUFFIX, TYPE, NAME, OP) \
78 void ptr_ ## NAME ## _ ## SUFFIX (TYPE *p, TYPE *a, TYPE *b) \
79 { \
80 *p = *a OP *b; \
83 #define CALL_OP(SUFFIX, TYPE, FUNC1, FUNC2) \
84 TYPE call_ ## SUFFIX (void) \
85 { \
86 TYPE value1 = FUNC1 (); \
87 TYPE value2 = FUNC2 (); \
88 return value1 + value2; \
91 #ifndef NO_ARG
92 #ifndef NO_ADD
93 FLOAT_ARG (add, +)
94 DOUBLE_ARG (add, +)
95 FLOAT128_ARG (add, +)
96 LDOUBLE_ARG (add, +)
97 #endif
99 #ifndef NO_SUB
100 FLOAT_ARG (sub, -)
101 DOUBLE_ARG (sub, -)
102 FLOAT128_ARG (sub, -)
103 LDOUBLE_ARG (sub, -)
104 #endif
106 #ifndef NO_MUL
107 FLOAT_ARG (mul, *)
108 DOUBLE_ARG (mul, *)
109 FLOAT128_ARG (mul, *)
110 LDOUBLE_ARG (mul, *)
111 #endif
113 #ifndef NO_DIV
114 FLOAT_ARG (div, /)
115 DOUBLE_ARG (div, /)
116 FLOAT128_ARG (div, /)
117 LDOUBLE_ARG (div, /)
118 #endif
119 #endif
121 #ifndef NO_PTR
122 #ifndef NO_ADD
123 FLOAT_PTR (add, +)
124 DOUBLE_PTR (add, +)
125 FLOAT128_PTR (add, +)
126 LDOUBLE_PTR (add, +)
127 #endif
129 #ifndef NO_SUB
130 FLOAT_PTR (sub, -)
131 DOUBLE_PTR (sub, -)
132 FLOAT128_PTR (sub, -)
133 LDOUBLE_PTR (sub, -)
134 #endif
136 #ifndef NO_MUL
137 FLOAT_PTR (mul, *)
138 DOUBLE_PTR (mul, *)
139 FLOAT128_PTR (mul, *)
140 LDOUBLE_PTR (mul, *)
141 #endif
143 #ifndef NO_DIV
144 FLOAT_PTR (div, /)
145 DOUBLE_PTR (div, /)
146 FLOAT128_PTR (div, /)
147 LDOUBLE_PTR (div, /)
148 #endif
149 #endif
151 #ifndef NO_CALL
152 FLOAT_CALL ()
153 DOUBLE_CALL ()
154 FLOAT128_CALL ()
155 LDOUBLE_CALL ()
156 #endif
158 /* { dg-final { scan-assembler "xsaddqp" } } */
159 /* { dg-final { scan-assembler "xssubqp" } } */