aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/float128-complex-2.c
blob: 06dd8e2f01b2e06121f2df08d419b502272530d8 (plain)
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
157
158
159
160
/* { dg-do compile { target { powerpc*-*-linux* } } } */
/* { dg-require-effective-target powerpc_float128_hw_ok } */
/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
/* { dg-options "-O2 -mcpu=power9 -mfloat128 -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"  } } */