summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/p8vector-builtin-2.c
blob: 13df1485cbab775468c7082d82e88a938a8cb882 (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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
/* { dg-require-effective-target powerpc_p8vector_ok } */
/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
/* { dg-options "-mcpu=power8 -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */

#include <altivec.h>

typedef vector long long		v_sign;
typedef vector unsigned long long	v_uns;
typedef vector bool long long		v_bool;

v_sign sign_add_1 (v_sign a, v_sign b)
{
  return __builtin_altivec_vaddudm (a, b);
}

v_sign sign_add_2 (v_sign a, v_sign b)
{
  return vec_add (a, b);
}

v_sign sign_add_3 (v_sign a, v_sign b)
{
  return vec_vaddudm (a, b);
}

v_sign sign_sub_1 (v_sign a, v_sign b)
{
  return __builtin_altivec_vsubudm (a, b);
}

v_sign sign_sub_2 (v_sign a, v_sign b)
{
  return vec_sub (a, b);
}


v_sign sign_sub_3 (v_sign a, v_sign b)
{
  return vec_vsubudm (a, b);
}

v_sign sign_min_1 (v_sign a, v_sign b)
{
  return __builtin_altivec_vminsd (a, b);
}

v_sign sign_min_2 (v_sign a, v_sign b)
{
  return vec_min (a, b);
}

v_sign sign_min_3 (v_sign a, v_sign b)
{
  return vec_vminsd (a, b);
}

v_sign sign_max_1 (v_sign a, v_sign b)
{
  return __builtin_altivec_vmaxsd (a, b);
}

v_sign sign_max_2 (v_sign a, v_sign b)
{
  return vec_max (a, b);
}

v_sign sign_max_3 (v_sign a, v_sign b)
{
  return vec_vmaxsd (a, b);
}

v_sign sign_abs (v_sign a)
{
  return vec_abs (a);		/* xor, vsubudm, vmaxsd.  */
}

v_bool sign_eq (v_sign a, v_sign b)
{
  return vec_cmpeq (a, b);
}

v_bool sign_lt (v_sign a, v_sign b)
{
  return vec_cmplt (a, b);
}

v_uns uns_add_2 (v_uns a, v_uns b)
{
  return vec_add (a, b);
}

v_uns uns_add_3 (v_uns a, v_uns b)
{
  return vec_vaddudm (a, b);
}

v_uns uns_sub_2 (v_uns a, v_uns b)
{
  return vec_sub (a, b);
}

v_uns uns_sub_3 (v_uns a, v_uns b)
{
  return vec_vsubudm (a, b);
}

v_uns uns_min_2 (v_uns a, v_uns b)
{
  return vec_min (a, b);
}

v_uns uns_min_3 (v_uns a, v_uns b)
{
  return vec_vminud (a, b);
}

v_uns uns_max_2 (v_uns a, v_uns b)
{
  return vec_max (a, b);
}

v_uns uns_max_3 (v_uns a, v_uns b)
{
  return vec_vmaxud (a, b);
}

v_bool uns_eq (v_uns a, v_uns b)
{
  return vec_cmpeq (a, b);
}

v_bool uns_lt (v_uns a, v_uns b)
{
  return vec_cmplt (a, b);
}

v_sign sign_rl_1 (v_sign a, v_sign b)
{
  return __builtin_altivec_vrld (a, b);
}

v_sign sign_rl_2 (v_sign a, v_uns b)
{
  return vec_rl (a, b);
}

v_uns uns_rl_2 (v_uns a, v_uns b)
{
  return vec_rl (a, b);
}

v_sign sign_sl_1 (v_sign a, v_sign b)
{
  return __builtin_altivec_vsld (a, b);
}

v_sign sign_sl_2 (v_sign a, v_uns b)
{
  return vec_sl (a, b);
}

v_sign sign_sl_3 (v_sign a, v_uns b)
{
  return vec_vsld (a, b);
}

v_uns uns_sl_2 (v_uns a, v_uns b)
{
  return vec_sl (a, b);
}

v_uns uns_sl_3 (v_uns a, v_uns b)
{
  return vec_vsld (a, b);
}

v_sign sign_sra_1 (v_sign a, v_sign b)
{
  return __builtin_altivec_vsrad (a, b);
}

v_sign sign_sra_2 (v_sign a, v_uns b)
{
  return vec_sra (a, b);
}

v_sign sign_sra_3 (v_sign a, v_uns b)
{
  return vec_vsrad (a, b);
}

/* { dg-final { scan-assembler-times "vaddudm" 	5 } } */
/* { dg-final { scan-assembler-times "vsubudm" 	6 } } */
/* { dg-final { scan-assembler-times "vmaxsd"  	4 } } */
/* { dg-final { scan-assembler-times "vminsd"  	3 } } */
/* { dg-final { scan-assembler-times "vmaxud"  	2 } } */
/* { dg-final { scan-assembler-times "vminud"  	2 } } */
/* { dg-final { scan-assembler-times "vcmpequd" 2 } } */
/* { dg-final { scan-assembler-times "vcmpgtsd" 1 } } */
/* { dg-final { scan-assembler-times "vcmpgtud" 1 } } */
/* { dg-final { scan-assembler-times "vrld"     3 } } */
/* { dg-final { scan-assembler-times "vsld"     5 } } */
/* { dg-final { scan-assembler-times "vsrad"    3 } } */