Clang Project

clang_source_code/test/CodeGen/builtins-ppc-vsx.c
1// REQUIRES: powerpc-registered-target
2// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx -triple powerpc64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
3// RUN: %clang_cc1 -target-feature +altivec -target-feature +vsx -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=CHECK-LE
4#include <altivec.h>
5
6vector bool char vbc = { 0, 1, 0, 1, 0, 1, 0, 1,
7                         0, 1, 0, 1, 0, 1, 0, 1 };
8vector signed char vsc = { -8,  9, -10, 11, -12, 13, -14, 15,
9                           -0,  1,  -2,  3,  -4,  5,  -6,  7};
10vector unsigned char vuc = { 8,  9, 10, 11, 12, 13, 14, 15,
11                             0,  1,  2,  3,  4,  5,  6,  7};
12vector float vf = { -1.5, 2.5, -3.5, 4.5 };
13vector double vd = { 3.5, -7.5 };
14vector bool short vbs = { 0, 1, 0, 1, 0, 1, 0, 1 };
15vector signed short vss = { -1, 2, -3, 4, -5, 6, -7, 8 };
16vector unsigned short vus = { 0, 1, 2, 3, 4, 5, 6, 7 };
17vector bool int vbi = { 0, 1, 0, 1 };
18vector signed int vsi = { -1, 2, -3, 4 };
19vector unsigned int vui = { 0, 1, 2, 3 };
20vector bool long long vbll = { 1, 0 };
21vector signed long long vsll = { 255LL, -937LL };
22vector unsigned long long vull = { 1447LL, 2894LL };
23double d = 23.4;
24signed long long sll = 618LL;
25float af[4] = {23.4f, 56.7f, 89.0f, 12.3f};
26double ad[2] = {23.4, 56.7};
27signed char asc[16] = { -8,  9, -10, 11, -12, 13, -14, 15,
28                        -0,  1,  -2,  3,  -4,  5,  -6,  7};
29unsigned char auc[16] = { 8,  9, 10, 11, 12, 13, 14, 15,
30                          0,  1,  2,  3,  4,  5,  6,  7};
31signed short ass[8] = { -1, 2, -3, 4, -5, 6, -7, 8 };
32unsigned short aus[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
33signed int asi[4] = { -1, 2, -3, 4 };
34unsigned int aui[4] = { 0, 1, 2, 3 };
35signed long long asll[2] = { -1L, 2L };
36unsigned long long aull[2] = { 1L, 2L };
37
38vector float res_vf;
39vector double res_vd;
40vector bool char res_vbc;
41vector signed char res_vsc;
42vector unsigned char res_vuc;
43vector bool short res_vbs;
44vector signed short res_vss;
45vector unsigned short res_vus;
46vector bool int res_vbi;
47vector signed int res_vsi;
48vector unsigned int res_vui;
49vector bool long long res_vbll;
50vector signed long long res_vsll;
51vector unsigned long long res_vull;
52vector signed __int128 res_vslll;
53
54double res_d;
55float res_af[4];
56double res_ad[2];
57signed char res_asc[16];
58unsigned char res_auc[16];
59signed short res_ass[8];
60unsigned short res_aus[8];
61signed int res_asi[4];
62unsigned int res_aui[4];
63
64void dummy() { }
65
66void test1() {
67// CHECK-LABEL: define void @test1
68// CHECK-LE-LABEL: define void @test1
69
70  res_vf = vec_abs(vf);
71// CHECK: call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{[0-9]*}})
72// CHECK-LE: call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{[0-9]*}})
73
74  res_vd = vec_abs(vd);
75// CHECK: call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{[0-9]*}})
76// CHECK-LE: call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{[0-9]*}})
77
78  res_vf = vec_nabs(vf);
79// CHECK: [[VEC:%[0-9]+]] = call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{[0-9]*}})
80// CHECK-NEXT: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, [[VEC]]
81
82  res_vd = vec_nabs(vd);
83// CHECK: [[VECD:%[0-9]+]] = call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{[0-9]*}})
84// CHECK: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, [[VECD]]
85
86  dummy();
87// CHECK: call void @dummy()
88// CHECK-LE: call void @dummy()
89
90  res_vd = vec_add(vd, vd);
91// CHECK: fadd <2 x double>
92// CHECK-LE: fadd <2 x double>
93
94  res_vd = vec_and(vbll, vd);
95// CHECK: and <2 x i64>
96// CHECK: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
97// CHECK-LE: and <2 x i64>
98// CHECK-LE: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
99
100  res_vd = vec_and(vd, vbll);
101// CHECK: and <2 x i64>
102// CHECK: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
103// CHECK-LE: and <2 x i64>
104// CHECK-LE: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
105
106  res_vd = vec_and(vd, vd);
107// CHECK: and <2 x i64>
108// CHECK: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
109// CHECK-LE: and <2 x i64>
110// CHECK-LE: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
111
112  dummy();
113// CHECK: call void @dummy()
114// CHECK-LE: call void @dummy()
115
116  res_vd = vec_andc(vbll, vd);
117// CHECK: bitcast <2 x double> %{{[0-9]*}} to <2 x i64>
118// CHECK: xor <2 x i64> %{{[0-9]*}}, <i64 -1, i64 -1>
119// CHECK: and <2 x i64>
120// CHECK: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
121// CHECK-LE: bitcast <2 x double> %{{[0-9]*}} to <2 x i64>
122// CHECK-LE: xor <2 x i64> %{{[0-9]*}}, <i64 -1, i64 -1>
123// CHECK-LE: and <2 x i64>
124// CHECK-LE: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
125
126  dummy();
127// CHECK: call void @dummy()
128// CHECK-LE: call void @dummy()
129
130  res_vd = vec_andc(vd, vbll);
131// CHECK: bitcast <2 x double> %{{[0-9]*}} to <2 x i64>
132// CHECK: xor <2 x i64> %{{[0-9]*}}, <i64 -1, i64 -1>
133// CHECK: and <2 x i64>
134// CHECK: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
135// CHECK-LE: bitcast <2 x double> %{{[0-9]*}} to <2 x i64>
136// CHECK-LE: xor <2 x i64> %{{[0-9]*}}, <i64 -1, i64 -1>
137// CHECK-LE: and <2 x i64>
138// CHECK-LE: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
139
140  dummy();
141// CHECK: call void @dummy()
142
143  res_vd = vec_andc(vd, vd);
144// CHECK: bitcast <2 x double> %{{[0-9]*}} to <2 x i64>
145// CHECK: xor <2 x i64> %{{[0-9]*}}, <i64 -1, i64 -1>
146// CHECK: and <2 x i64>
147// CHECK: bitcast <2 x i64> %{{[0-9]*}} to <2 x double>
148
149  dummy();
150// CHECK: call void @dummy()
151// CHECK-LE: call void @dummy()
152
153  res_vd = vec_ceil(vd);
154// CHECK: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{[0-9]*}})
155// CHECK-LE: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{[0-9]*}})
156
157  res_vf = vec_ceil(vf);
158// CHECK: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{[0-9]*}})
159// CHECK-LE: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{[0-9]*}})
160
161  res_vbll = vec_cmpeq(vd, vd);
162// CHECK: call <2 x i64> @llvm.ppc.vsx.xvcmpeqdp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
163// CHECK-LE: call <2 x i64> @llvm.ppc.vsx.xvcmpeqdp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
164
165  res_vbi = vec_cmpeq(vf, vf);
166// CHECK: call <4 x i32> @llvm.ppc.vsx.xvcmpeqsp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
167// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.xvcmpeqsp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
168
169  res_vbll = vec_cmpge(vd, vd);
170// CHECK: call <2 x i64> @llvm.ppc.vsx.xvcmpgedp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
171// CHECK-LE: call <2 x i64> @llvm.ppc.vsx.xvcmpgedp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
172
173  res_vbi = vec_cmpge(vf, vf);
174// CHECK: call <4 x i32> @llvm.ppc.vsx.xvcmpgesp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
175// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.xvcmpgesp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
176
177  res_vbll = vec_cmpgt(vd, vd);
178// CHECK: call <2 x i64> @llvm.ppc.vsx.xvcmpgtdp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
179// CHECK-LE: call <2 x i64> @llvm.ppc.vsx.xvcmpgtdp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
180
181  res_vbi = vec_cmpgt(vf, vf);
182// CHECK: call <4 x i32> @llvm.ppc.vsx.xvcmpgtsp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
183// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.xvcmpgtsp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
184
185  res_vbll = vec_cmple(vd, vd);
186// CHECK: call <2 x i64> @llvm.ppc.vsx.xvcmpgedp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
187// CHECK-LE: call <2 x i64> @llvm.ppc.vsx.xvcmpgedp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
188
189  res_vbi = vec_cmple(vf, vf);
190// CHECK: call <4 x i32> @llvm.ppc.vsx.xvcmpgesp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
191// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.xvcmpgesp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
192
193  res_vbll = vec_cmplt(vd, vd);
194// CHECK: call <2 x i64> @llvm.ppc.vsx.xvcmpgtdp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
195// CHECK-LE: call <2 x i64> @llvm.ppc.vsx.xvcmpgtdp(<2 x double> %{{[0-9]*}}, <2 x double> %{{[0-9]*}})
196
197  res_vbi = vec_cmplt(vf, vf);
198// CHECK: call <4 x i32> @llvm.ppc.vsx.xvcmpgtsp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
199// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.xvcmpgtsp(<4 x float> %{{[0-9]*}}, <4 x float> %{{[0-9]*}})
200
201  /* vec_cpsgn */
202  res_vf = vec_cpsgn(vf, vf);
203// CHECK: call <4 x float> @llvm.copysign.v4f32(<4 x float> %{{.+}}, <4 x float> %{{.+}})
204// CHECK-LE: call <4 x float> @llvm.copysign.v4f32(<4 x float> %{{.+}}, <4 x float> %{{.+}})
205
206  res_vd = vec_cpsgn(vd, vd);
207// CHECK: call <2 x double> @llvm.copysign.v2f64(<2 x double> %{{.+}}, <2 x double> %{{.+}})
208// CHECK-LE: call <2 x double> @llvm.copysign.v2f64(<2 x double> %{{.+}}, <2 x double> %{{.+}})
209
210  /* vec_div */
211  res_vsll = vec_div(vsll, vsll);
212// CHECK: sdiv <2 x i64>
213// CHECK-LE: sdiv <2 x i64>
214
215  res_vull = vec_div(vull, vull);
216// CHECK: udiv <2 x i64>
217// CHECK-LE: udiv <2 x i64>
218
219  res_vf = vec_div(vf, vf);
220// CHECK: fdiv <4 x float>
221// CHECK-LE: fdiv <4 x float>
222
223  res_vd = vec_div(vd, vd);
224// CHECK: fdiv <2 x double>
225// CHECK-LE: fdiv <2 x double>
226
227  /* vec_max */
228  res_vf = vec_max(vf, vf);
229// CHECK: @llvm.ppc.vsx.xvmaxsp
230// CHECK-LE: @llvm.ppc.vsx.xvmaxsp
231
232  res_vd = vec_max(vd, vd);
233// CHECK: @llvm.ppc.vsx.xvmaxdp
234// CHECK-LE: @llvm.ppc.vsx.xvmaxdp
235
236  res_vf = vec_vmaxfp(vf, vf);
237// CHECK: @llvm.ppc.vsx.xvmaxsp
238// CHECK-LE: @llvm.ppc.vsx.xvmaxsp
239
240  /* vec_min */
241  res_vf = vec_min(vf, vf);
242// CHECK: @llvm.ppc.vsx.xvminsp
243// CHECK-LE: @llvm.ppc.vsx.xvminsp
244
245  res_vd = vec_min(vd, vd);
246// CHECK: @llvm.ppc.vsx.xvmindp
247// CHECK-LE: @llvm.ppc.vsx.xvmindp
248
249  res_vf = vec_vminfp(vf, vf);
250// CHECK: @llvm.ppc.vsx.xvminsp
251// CHECK-LE: @llvm.ppc.vsx.xvminsp
252
253  res_d = __builtin_vsx_xsmaxdp(d, d);
254// CHECK: @llvm.ppc.vsx.xsmaxdp
255// CHECK-LE: @llvm.ppc.vsx.xsmaxdp
256
257  res_d = __builtin_vsx_xsmindp(d, d);
258// CHECK: @llvm.ppc.vsx.xsmindp
259// CHECK-LE: @llvm.ppc.vsx.xsmindp
260
261  /* vec_perm */
262  res_vsll = vec_perm(vsll, vsll, vuc);
263// CHECK: @llvm.ppc.altivec.vperm
264// CHECK-LE: @llvm.ppc.altivec.vperm
265
266  res_vull = vec_perm(vull, vull, vuc);
267// CHECK: @llvm.ppc.altivec.vperm
268// CHECK-LE: @llvm.ppc.altivec.vperm
269
270  res_vbll = vec_perm(vbll, vbll, vuc);
271// CHECK: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
272// CHECK: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
273// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
274// CHECK-LE: xor <16 x i8>
275// CHECK-LE: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
276// CHECK-LE: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
277// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
278
279  res_vf = vec_round(vf);
280// CHECK: call <4 x float> @llvm.round.v4f32(<4 x float>
281// CHECK-LE: call <4 x float> @llvm.round.v4f32(<4 x float>
282
283  res_vd = vec_round(vd);
284// CHECK: call <2 x double> @llvm.round.v2f64(<2 x double>
285// CHECK-LE: call <2 x double> @llvm.round.v2f64(<2 x double>
286
287  res_vd = vec_perm(vd, vd, vuc);
288// CHECK: @llvm.ppc.altivec.vperm
289// CHECK-LE: @llvm.ppc.altivec.vperm
290
291  res_vd = vec_splat(vd, 1);
292// CHECK: [[T1:%.+]] = bitcast <2 x double> {{.+}} to <4 x i32>
293// CHECK: [[T2:%.+]] = bitcast <2 x double> {{.+}} to <4 x i32>
294// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
295// CHECK-LE: xor <16 x i8>
296// CHECK-LE: [[T1:%.+]] = bitcast <2 x double> {{.+}} to <4 x i32>
297// CHECK-LE: [[T2:%.+]] = bitcast <2 x double> {{.+}} to <4 x i32>
298// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
299
300  res_vbll = vec_splat(vbll, 1);
301// CHECK: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
302// CHECK: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
303// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
304// CHECK-LE: xor <16 x i8>
305// CHECK-LE: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
306// CHECK-LE: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
307// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
308
309  res_vsll =  vec_splat(vsll, 1);
310// CHECK: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
311// CHECK: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
312// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
313// CHECK-LE: xor <16 x i8>
314// CHECK-LE: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
315// CHECK-LE: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
316// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
317
318  res_vull =  vec_splat(vull, 1);
319// CHECK: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
320// CHECK: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
321// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
322// CHECK-LE: xor <16 x i8>
323// CHECK-LE: [[T1:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
324// CHECK-LE: [[T2:%.+]] = bitcast <2 x i64> {{.+}} to <4 x i32>
325// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> [[T1]], <4 x i32> [[T2]], <16 x i8>
326
327  res_vsi = vec_pack(vsll, vsll);
328// CHECK: @llvm.ppc.altivec.vperm
329// CHECK-LE: @llvm.ppc.altivec.vperm
330
331  res_vui = vec_pack(vull, vull);
332// CHECK: @llvm.ppc.altivec.vperm
333// CHECK-LE: @llvm.ppc.altivec.vperm
334
335  res_vbi = vec_pack(vbll, vbll);
336// CHECK: @llvm.ppc.altivec.vperm
337// CHECK-LE: @llvm.ppc.altivec.vperm
338
339  res_vsll = vec_vperm(vsll, vsll, vuc);
340// CHECK: @llvm.ppc.altivec.vperm
341// CHECK-LE: @llvm.ppc.altivec.vperm
342
343  res_vull = vec_vperm(vull, vull, vuc);
344// CHECK: @llvm.ppc.altivec.vperm
345// CHECK-LE: @llvm.ppc.altivec.vperm
346
347  res_vd = vec_vperm(vd, vd, vuc);
348// CHECK: @llvm.ppc.altivec.vperm
349// CHECK-LE: @llvm.ppc.altivec.vperm
350
351  /* vec_vsx_ld */
352
353  res_vbi = vec_vsx_ld(0, &vbi);
354// CHECK: @llvm.ppc.vsx.lxvw4x
355// CHECK-LE: @llvm.ppc.vsx.lxvw4x
356
357  res_vsi = vec_vsx_ld(0, &vsi);
358// CHECK: @llvm.ppc.vsx.lxvw4x
359// CHECK-LE: @llvm.ppc.vsx.lxvw4x
360
361  res_vsi = vec_vsx_ld(0, asi);
362// CHECK: @llvm.ppc.vsx.lxvw4x
363// CHECK-LE: @llvm.ppc.vsx.lxvw4x
364
365  res_vui = vec_vsx_ld(0, &vui);
366// CHECK: @llvm.ppc.vsx.lxvw4x
367// CHECK-LE: @llvm.ppc.vsx.lxvw4x
368
369  res_vui = vec_vsx_ld(0, aui);
370// CHECK: @llvm.ppc.vsx.lxvw4x
371// CHECK-LE: @llvm.ppc.vsx.lxvw4x
372
373  res_vf = vec_vsx_ld (0, &vf);
374// CHECK: @llvm.ppc.vsx.lxvw4x
375// CHECK-LE: @llvm.ppc.vsx.lxvw4x
376
377  res_vf = vec_vsx_ld (0, af);
378// CHECK: @llvm.ppc.vsx.lxvw4x
379// CHECK-LE: @llvm.ppc.vsx.lxvw4x
380
381  res_vsll = vec_vsx_ld(0, &vsll);
382// CHECK: @llvm.ppc.vsx.lxvd2x
383// CHECK-LE: @llvm.ppc.vsx.lxvd2x
384
385  res_vull = vec_vsx_ld(0, &vull);
386// CHECK: @llvm.ppc.vsx.lxvd2x
387// CHECK-LE: @llvm.ppc.vsx.lxvd2x
388
389  res_vd = vec_vsx_ld(0, &vd);
390// CHECK: @llvm.ppc.vsx.lxvd2x
391// CHECK-LE: @llvm.ppc.vsx.lxvd2x
392
393  res_vd = vec_vsx_ld(0, ad);
394// CHECK: @llvm.ppc.vsx.lxvd2x
395// CHECK-LE: @llvm.ppc.vsx.lxvd2x
396
397  res_vbs = vec_vsx_ld(0, &vbs);
398// CHECK: @llvm.ppc.vsx.lxvw4x
399// CHECK-LE: @llvm.ppc.vsx.lxvw4x
400
401  res_vss = vec_vsx_ld(0, &vss);
402// CHECK: @llvm.ppc.vsx.lxvw4x
403// CHECK-LE: @llvm.ppc.vsx.lxvw4x
404
405  res_vss = vec_vsx_ld(0, ass);
406// CHECK: @llvm.ppc.vsx.lxvw4x
407// CHECK-LE: @llvm.ppc.vsx.lxvw4x
408
409  res_vus = vec_vsx_ld(0, &vus);
410// CHECK: @llvm.ppc.vsx.lxvw4x
411// CHECK-LE: @llvm.ppc.vsx.lxvw4x
412
413  res_vus = vec_vsx_ld(0, aus);
414// CHECK: @llvm.ppc.vsx.lxvw4x
415// CHECK-LE: @llvm.ppc.vsx.lxvw4x
416
417  res_vbc = vec_vsx_ld(0, &vbc);
418// CHECK: @llvm.ppc.vsx.lxvw4x
419// CHECK-LE: @llvm.ppc.vsx.lxvw4x
420
421  res_vsc = vec_vsx_ld(0, &vsc);
422// CHECK: @llvm.ppc.vsx.lxvw4x
423// CHECK-LE: @llvm.ppc.vsx.lxvw4x
424
425  res_vuc = vec_vsx_ld(0, &vuc);
426// CHECK: @llvm.ppc.vsx.lxvw4x
427// CHECK-LE: @llvm.ppc.vsx.lxvw4x
428
429  res_vsc = vec_vsx_ld(0, asc);
430// CHECK: @llvm.ppc.vsx.lxvw4x
431// CHECK-LE: @llvm.ppc.vsx.lxvw4x
432
433  res_vuc = vec_vsx_ld(0, auc);
434// CHECK: @llvm.ppc.vsx.lxvw4x
435// CHECK-LE: @llvm.ppc.vsx.lxvw4x
436
437  /* vec_vsx_st */
438
439  vec_vsx_st(vbi, 0, &res_vbi);
440// CHECK: @llvm.ppc.vsx.stxvw4x
441// CHECK-LE: @llvm.ppc.vsx.stxvw4x
442
443  vec_vsx_st(vbi, 0, res_aui);
444// CHECK: @llvm.ppc.vsx.stxvw4x
445// CHECK-LE: @llvm.ppc.vsx.stxvw4x
446
447  vec_vsx_st(vbi, 0, res_asi);
448// CHECK: @llvm.ppc.vsx.stxvw4x
449// CHECK-LE: @llvm.ppc.vsx.stxvw4x
450
451  vec_vsx_st(vsi, 0, &res_vsi);
452// CHECK: @llvm.ppc.vsx.stxvw4x
453// CHECK-LE: @llvm.ppc.vsx.stxvw4x
454
455  vec_vsx_st(vsi, 0, res_asi);
456// CHECK: @llvm.ppc.vsx.stxvw4x
457// CHECK-LE: @llvm.ppc.vsx.stxvw4x
458
459  vec_vsx_st(vui, 0, &res_vui);
460// CHECK: @llvm.ppc.vsx.stxvw4x
461// CHECK-LE: @llvm.ppc.vsx.stxvw4x
462
463  vec_vsx_st(vui, 0, res_aui);
464// CHECK: @llvm.ppc.vsx.stxvw4x
465// CHECK-LE: @llvm.ppc.vsx.stxvw4x
466
467  vec_vsx_st(vf, 0, &res_vf);
468// CHECK: @llvm.ppc.vsx.stxvw4x
469// CHECK-LE: @llvm.ppc.vsx.stxvw4x
470
471  vec_vsx_st(vf, 0, res_af);
472// CHECK: @llvm.ppc.vsx.stxvw4x
473// CHECK-LE: @llvm.ppc.vsx.stxvw4x
474
475  vec_vsx_st(vsll, 0, &res_vsll);
476// CHECK: @llvm.ppc.vsx.stxvd2x
477// CHECK-LE: @llvm.ppc.vsx.stxvd2x
478
479  vec_vsx_st(vull, 0, &res_vull);
480// CHECK: @llvm.ppc.vsx.stxvd2x
481// CHECK-LE: @llvm.ppc.vsx.stxvd2x
482
483  vec_vsx_st(vd, 0, &res_vd);
484// CHECK: @llvm.ppc.vsx.stxvd2x
485// CHECK-LE: @llvm.ppc.vsx.stxvd2x
486
487  vec_vsx_st(vd, 0, res_ad);
488// CHECK: @llvm.ppc.vsx.stxvd2x
489// CHECK-LE: @llvm.ppc.vsx.stxvd2x
490
491  vec_vsx_st(vbs, 0, &res_vbs);
492// CHECK: @llvm.ppc.vsx.stxvw4x
493// CHECK-LE: @llvm.ppc.vsx.stxvw4x
494
495  vec_vsx_st(vbs, 0, res_aus);
496// CHECK: @llvm.ppc.vsx.stxvw4x
497// CHECK-LE: @llvm.ppc.vsx.stxvw4x
498
499  vec_vsx_st(vbs, 0, res_ass);
500// CHECK: @llvm.ppc.vsx.stxvw4x
501// CHECK-LE: @llvm.ppc.vsx.stxvw4x
502
503  vec_vsx_st(vss, 0, &res_vss);
504// CHECK: @llvm.ppc.vsx.stxvw4x
505// CHECK-LE: @llvm.ppc.vsx.stxvw4x
506
507  vec_vsx_st(vss, 0, res_ass);
508// CHECK: @llvm.ppc.vsx.stxvw4x
509// CHECK-LE: @llvm.ppc.vsx.stxvw4x
510
511  vec_vsx_st(vus, 0, &res_vus);
512// CHECK: @llvm.ppc.vsx.stxvw4x
513// CHECK-LE: @llvm.ppc.vsx.stxvw4x
514
515  vec_vsx_st(vus, 0, res_aus);
516// CHECK: @llvm.ppc.vsx.stxvw4x
517// CHECK-LE: @llvm.ppc.vsx.stxvw4x
518
519  vec_vsx_st(vsc, 0, &res_vsc);
520// CHECK: @llvm.ppc.vsx.stxvw4x
521// CHECK-LE: @llvm.ppc.vsx.stxvw4x
522
523  vec_vsx_st(vsc, 0, res_asc);
524// CHECK: @llvm.ppc.vsx.stxvw4x
525// CHECK-LE: @llvm.ppc.vsx.stxvw4x
526
527  vec_vsx_st(vuc, 0, &res_vuc);
528// CHECK: @llvm.ppc.vsx.stxvw4x
529// CHECK-LE: @llvm.ppc.vsx.stxvw4x
530
531  vec_vsx_st(vuc, 0, res_auc);
532// CHECK: @llvm.ppc.vsx.stxvw4x
533// CHECK-LE: @llvm.ppc.vsx.stxvw4x
534
535  vec_vsx_st(vbc, 0, &res_vbc);
536// CHECK: @llvm.ppc.vsx.stxvw4x
537// CHECK-LE: @llvm.ppc.vsx.stxvw4x
538
539  vec_vsx_st(vbc, 0, res_asc);
540// CHECK: @llvm.ppc.vsx.stxvw4x
541// CHECK-LE: @llvm.ppc.vsx.stxvw4x
542
543  vec_vsx_st(vbc, 0, res_auc);
544// CHECK: @llvm.ppc.vsx.stxvw4x
545// CHECK-LE: @llvm.ppc.vsx.stxvw4x
546
547  /* vec_and */
548  res_vsll = vec_and(vsll, vsll);
549// CHECK: and <2 x i64>
550// CHECK-LE: and <2 x i64>
551
552  res_vsll = vec_and(vbll, vsll);
553// CHECK: and <2 x i64>
554// CHECK-LE: and <2 x i64>
555
556  res_vsll = vec_and(vsll, vbll);
557// CHECK: and <2 x i64>
558// CHECK-LE: and <2 x i64>
559
560  res_vull = vec_and(vull, vull);
561// CHECK: and <2 x i64>
562// CHECK-LE: and <2 x i64>
563
564  res_vull = vec_and(vbll, vull);
565// CHECK: and <2 x i64>
566// CHECK-LE: and <2 x i64>
567
568  res_vull = vec_and(vull, vbll);
569// CHECK: and <2 x i64>
570// CHECK-LE: and <2 x i64>
571
572  res_vbll = vec_and(vbll, vbll);
573// CHECK: and <2 x i64>
574// CHECK-LE: and <2 x i64>
575
576  /* vec_vand */
577  res_vsll = vec_vand(vsll, vsll);
578// CHECK: and <2 x i64>
579// CHECK-LE: and <2 x i64>
580
581  res_vsll = vec_vand(vbll, vsll);
582// CHECK: and <2 x i64>
583// CHECK-LE: and <2 x i64>
584
585  res_vsll = vec_vand(vsll, vbll);
586// CHECK: and <2 x i64>
587// CHECK-LE: and <2 x i64>
588
589  res_vull = vec_vand(vull, vull);
590// CHECK: and <2 x i64>
591// CHECK-LE: and <2 x i64>
592
593  res_vull = vec_vand(vbll, vull);
594// CHECK: and <2 x i64>
595// CHECK-LE: and <2 x i64>
596
597  res_vull = vec_vand(vull, vbll);
598// CHECK: and <2 x i64>
599// CHECK-LE: and <2 x i64>
600
601  res_vbll = vec_vand(vbll, vbll);
602// CHECK: and <2 x i64>
603// CHECK-LE: and <2 x i64>
604
605  /* vec_andc */
606  res_vsll = vec_andc(vsll, vsll);
607// CHECK: xor <2 x i64>
608// CHECK: and <2 x i64>
609// CHECK-LE: xor <2 x i64>
610// CHECK-LE: and <2 x i64>
611
612  res_vsll = vec_andc(vbll, vsll);
613// CHECK: xor <2 x i64>
614// CHECK: and <2 x i64>
615// CHECK-LE: xor <2 x i64>
616// CHECK-LE: and <2 x i64>
617
618  res_vsll = vec_andc(vsll, vbll);
619// CHECK: xor <2 x i64>
620// CHECK: and <2 x i64>
621// CHECK-LE: xor <2 x i64>
622// CHECK-LE: and <2 x i64>
623
624  res_vull = vec_andc(vull, vull);
625// CHECK: xor <2 x i64>
626// CHECK: and <2 x i64>
627// CHECK-LE: xor <2 x i64>
628// CHECK-LE: and <2 x i64>
629
630  res_vull = vec_andc(vbll, vull);
631// CHECK: xor <2 x i64>
632// CHECK: and <2 x i64>
633// CHECK-LE: xor <2 x i64>
634// CHECK-LE: and <2 x i64>
635
636  res_vull = vec_andc(vull, vbll);
637// CHECK: xor <2 x i64>
638// CHECK: and <2 x i64>
639// CHECK-LE: xor <2 x i64>
640// CHECK-LE: and <2 x i64>
641
642  res_vbll = vec_andc(vbll, vbll);
643// CHECK: xor <2 x i64>
644// CHECK: and <2 x i64>
645// CHECK-LE: xor <2 x i64>
646// CHECK-LE: and <2 x i64>
647
648  res_vf = vec_floor(vf);
649// CHECK: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{[0-9]+}})
650// CHECK-LE: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{[0-9]+}})
651
652  res_vd = vec_floor(vd);
653// CHECK: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{[0-9]+}})
654// CHECK-LE: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{[0-9]+}})
655
656  res_vf = vec_madd(vf, vf, vf);
657// CHECK: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}})
658// CHECK-LE: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}})
659
660  res_vd = vec_madd(vd, vd, vd);
661// CHECK: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}})
662// CHECK-LE: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}})
663
664  /* vec_mergeh */
665  res_vsll = vec_mergeh(vsll, vsll);
666// CHECK: @llvm.ppc.altivec.vperm
667// CHECK-LE: @llvm.ppc.altivec.vperm
668
669  res_vsll = vec_mergeh(vsll, vbll);
670// CHECK: @llvm.ppc.altivec.vperm
671// CHECK-LE: @llvm.ppc.altivec.vperm
672
673  res_vsll = vec_mergeh(vbll, vsll);
674// CHECK: @llvm.ppc.altivec.vperm
675// CHECK-LE: @llvm.ppc.altivec.vperm
676
677  res_vull = vec_mergeh(vull, vull);
678// CHECK: @llvm.ppc.altivec.vperm
679// CHECK-LE: @llvm.ppc.altivec.vperm
680
681  res_vull = vec_mergeh(vull, vbll);
682// CHECK: @llvm.ppc.altivec.vperm
683// CHECK-LE: @llvm.ppc.altivec.vperm
684
685  res_vull = vec_mergeh(vbll, vull);
686// CHECK: @llvm.ppc.altivec.vperm
687// CHECK-LE: @llvm.ppc.altivec.vperm
688
689  /* vec_mergel */
690  res_vsll = vec_mergel(vsll, vsll);
691// CHECK: @llvm.ppc.altivec.vperm
692// CHECK-LE: @llvm.ppc.altivec.vperm
693
694  res_vsll = vec_mergel(vsll, vbll);
695// CHECK: @llvm.ppc.altivec.vperm
696// CHECK-LE: @llvm.ppc.altivec.vperm
697
698  res_vsll = vec_mergel(vbll, vsll);
699// CHECK: @llvm.ppc.altivec.vperm
700// CHECK-LE: @llvm.ppc.altivec.vperm
701
702  res_vull = vec_mergel(vull, vull);
703// CHECK: @llvm.ppc.altivec.vperm
704// CHECK-LE: @llvm.ppc.altivec.vperm
705
706  res_vull = vec_mergel(vull, vbll);
707// CHECK: @llvm.ppc.altivec.vperm
708// CHECK-LE: @llvm.ppc.altivec.vperm
709
710  res_vull = vec_mergel(vbll, vull);
711// CHECK: @llvm.ppc.altivec.vperm
712// CHECK-LE: @llvm.ppc.altivec.vperm
713
714  /* vec_msub */
715  res_vf = vec_msub(vf, vf, vf);
716// CHECK: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{[0-9]+}}
717// CHECK-NEXT: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float>
718// CHECK-LE: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{[0-9]+}}
719// CHECK-LE-NEXT: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float>
720
721  res_vd = vec_msub(vd, vd, vd);
722// CHECK: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %{{[0-9]+}}
723// CHECK-NEXT: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double>
724// CHECK-LE: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %{{[0-9]+}}
725// CHECK-LE-NEXT: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double>
726
727  res_vsll = vec_mul(vsll, vsll);
728// CHECK: mul <2 x i64>
729// CHECK-LE: mul <2 x i64>
730
731  res_vull = vec_mul(vull, vull);
732// CHECK: mul <2 x i64>
733// CHECK-LE: mul <2 x i64>
734
735  res_vf = vec_mul(vf, vf);
736// CHECK: fmul <4 x float> %{{[0-9]+}}, %{{[0-9]+}}
737// CHECK-LE: fmul <4 x float> %{{[0-9]+}}, %{{[0-9]+}}
738
739  res_vd = vec_mul(vd, vd);
740// CHECK: fmul <2 x double> %{{[0-9]+}}, %{{[0-9]+}}
741// CHECK-LE: fmul <2 x double> %{{[0-9]+}}, %{{[0-9]+}}
742
743  res_vf = vec_nearbyint(vf);
744// CHECK: call <4 x float> @llvm.round.v4f32(<4 x float> %{{[0-9]+}})
745// CHECK-LE: call <4 x float> @llvm.round.v4f32(<4 x float> %{{[0-9]+}})
746
747  res_vd = vec_nearbyint(vd);
748// CHECK: call <2 x double> @llvm.round.v2f64(<2 x double> %{{[0-9]+}})
749// CHECK-LE: call <2 x double> @llvm.round.v2f64(<2 x double> %{{[0-9]+}})
750
751  res_vf = vec_nmadd(vf, vf, vf);
752// CHECK: [[FM:[0-9]+]] = call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}})
753// CHECK-NEXT: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %[[FM]]
754// CHECK-LE: [[FM:[0-9]+]] = call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}})
755// CHECK-LE-NEXT: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %[[FM]]
756
757  res_vd = vec_nmadd(vd, vd, vd);
758// CHECK: [[FM:[0-9]+]] = call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}})
759// CHECK-NEXT: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %[[FM]]
760// CHECK-LE: [[FM:[0-9]+]] = call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}})
761// CHECK-LE-NEXT: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %[[FM]]
762
763  res_vf = vec_nmsub(vf, vf, vf);
764// CHECK: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{[0-9]+}}
765// CHECK-NEXT: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float>
766// CHECK: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{[0-9]+}}
767// CHECK-LE: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{[0-9]+}}
768// CHECK-LE-NEXT: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{[0-9]+}}, <4 x float> %{{[0-9]+}}, <4 x float>
769// CHECK-LE: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %{{[0-9]+}}
770
771  res_vd = vec_nmsub(vd, vd, vd);
772// CHECK: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %{{[0-9]+}}
773// CHECK-NEXT: [[FM:[0-9]+]] = call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double>
774// CHECK-NEXT: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %[[FM]]
775// CHECK-LE: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %{{[0-9]+}}
776// CHECK-LE-NEXT: [[FM:[0-9]+]] = call <2 x double> @llvm.fma.v2f64(<2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x double>
777// CHECK-LE-NEXT: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %[[FM]]
778
779  /* vec_nor */
780  res_vsll = vec_nor(vsll, vsll);
781// CHECK: or <2 x i64>
782// CHECK: xor <2 x i64>
783// CHECK-LE: or <2 x i64>
784// CHECK-LE: xor <2 x i64>
785
786  res_vull = vec_nor(vull, vull);
787// CHECK: or <2 x i64>
788// CHECK: xor <2 x i64>
789// CHECK-LE: or <2 x i64>
790// CHECK-LE: xor <2 x i64>
791
792  res_vull = vec_nor(vbll, vbll);
793// CHECK: or <2 x i64>
794// CHECK: xor <2 x i64>
795// CHECK-LE: or <2 x i64>
796// CHECK-LE: xor <2 x i64>
797
798  res_vd = vec_nor(vd, vd);
799// CHECK: bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
800// CHECK: [[OR:%.+]] = or <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
801// CHECK-NEXT: xor <2 x i64> [[OR]], <i64 -1, i64 -1>
802// CHECK-LE: bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
803// CHECK-LE: [[OR:%.+]] = or <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
804// CHECK-LE-NEXT: xor <2 x i64> [[OR]], <i64 -1, i64 -1>
805
806  /* vec_or */
807  res_vsll = vec_or(vsll, vsll);
808// CHECK: or <2 x i64>
809// CHECK-LE: or <2 x i64>
810
811  res_vsll = vec_or(vbll, vsll);
812// CHECK: or <2 x i64>
813// CHECK-LE: or <2 x i64>
814
815  res_vsll = vec_or(vsll, vbll);
816// CHECK: or <2 x i64>
817// CHECK-LE: or <2 x i64>
818
819  res_vull = vec_or(vull, vull);
820// CHECK: or <2 x i64>
821// CHECK-LE: or <2 x i64>
822
823  res_vull = vec_or(vbll, vull);
824// CHECK: or <2 x i64>
825// CHECK-LE: or <2 x i64>
826
827  res_vull = vec_or(vull, vbll);
828// CHECK: or <2 x i64>
829// CHECK-LE: or <2 x i64>
830
831  res_vbll = vec_or(vbll, vbll);
832// CHECK: or <2 x i64>
833// CHECK-LE: or <2 x i64>
834
835  res_vd = vec_or(vd, vd);
836// CHECK: bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
837// CHECK: or <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
838// CHECK-LE: bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
839// CHECK-LE: or <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
840
841  res_vd = vec_or(vbll, vd);
842// CHECK: [[T1:%.+]] = bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
843// CHECK: [[T2:%.+]] = or <2 x i64> %{{[0-9]+}}, [[T1]]
844// CHECK: bitcast <2 x i64> [[T2]] to <2 x double>
845// CHECK-LE: [[T1:%.+]] = bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
846// CHECK-LE: [[T2:%.+]] = or <2 x i64> %{{[0-9]+}}, [[T1]]
847// CHECK-LE: bitcast <2 x i64> [[T2]] to <2 x double>
848
849  res_vd = vec_or(vd, vbll);
850// CHECK: [[T1:%.+]] = bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
851// CHECK: [[T2:%.+]] = or <2 x i64> [[T1]], %{{[0-9]+}}
852// CHECK: bitcast <2 x i64> [[T2]] to <2 x double>
853// CHECK-LE: [[T1:%.+]] = bitcast <2 x double> %{{[0-9]+}} to <2 x i64>
854// CHECK-LE: [[T2:%.+]] = or <2 x i64> [[T1]], %{{[0-9]+}}
855// CHECK-LE: bitcast <2 x i64> [[T2]] to <2 x double>
856
857  res_vf = vec_re(vf);
858// CHECK: call <4 x float> @llvm.ppc.vsx.xvresp(<4 x float>
859// CHECK-LE: call <4 x float> @llvm.ppc.vsx.xvresp(<4 x float>
860
861  res_vd = vec_re(vd);
862// CHECK: call <2 x double> @llvm.ppc.vsx.xvredp(<2 x double>
863// CHECK-LE: call <2 x double> @llvm.ppc.vsx.xvredp(<2 x double>
864
865  res_vf = vec_rint(vf);
866// CHECK: call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %{{[0-9]+}})
867// CHECK-LE: call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %{{[0-9]+}})
868
869  res_vd = vec_rint(vd);
870// CHECK: call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %{{[0-9]+}})
871// CHECK-LE: call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %{{[0-9]+}})
872
873  res_vf = vec_rsqrte(vf);
874// CHECK: call <4 x float> @llvm.ppc.vsx.xvrsqrtesp(<4 x float> %{{[0-9]+}})
875// CHECK-LE: call <4 x float> @llvm.ppc.vsx.xvrsqrtesp(<4 x float> %{{[0-9]+}})
876
877  res_vd = vec_rsqrte(vd);
878// CHECK: call <2 x double> @llvm.ppc.vsx.xvrsqrtedp(<2 x double> %{{[0-9]+}})
879// CHECK-LE: call <2 x double> @llvm.ppc.vsx.xvrsqrtedp(<2 x double> %{{[0-9]+}})
880
881  dummy();
882// CHECK: call void @dummy()
883// CHECK-LE: call void @dummy()
884
885  res_vf = vec_sel(vd, vd, vbll);
886// CHECK: xor <2 x i64> %{{[0-9]+}}, <i64 -1, i64 -1>
887// CHECK: and <2 x i64> %{{[0-9]+}},
888// CHECK: and <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
889// CHECK: or <2 x i64>
890// CHECK: bitcast <2 x i64> %{{[0-9]+}} to <2 x double>
891// CHECK-LE: xor <2 x i64> %{{[0-9]+}}, <i64 -1, i64 -1>
892// CHECK-LE: and <2 x i64> %{{[0-9]+}},
893// CHECK-LE: and <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
894// CHECK-LE: or <2 x i64>
895// CHECK-LE: bitcast <2 x i64> %{{[0-9]+}} to <2 x double>
896
897  dummy();
898// CHECK: call void @dummy()
899// CHECK-LE: call void @dummy()
900
901  res_vd = vec_sel(vd, vd, vull);
902// CHECK: xor <2 x i64> %{{[0-9]+}}, <i64 -1, i64 -1>
903// CHECK: and <2 x i64> %{{[0-9]+}},
904// CHECK: and <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
905// CHECK: or <2 x i64>
906// CHECK: bitcast <2 x i64> %{{[0-9]+}} to <2 x double>
907// CHECK-LE: xor <2 x i64> %{{[0-9]+}}, <i64 -1, i64 -1>
908// CHECK-LE: and <2 x i64> %{{[0-9]+}},
909// CHECK-LE: and <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
910// CHECK-LE: or <2 x i64>
911// CHECK-LE: bitcast <2 x i64> %{{[0-9]+}} to <2 x double>
912
913  res_vf = vec_sqrt(vf);
914// CHECK: call <4 x float> @llvm.sqrt.v4f32(<4 x float> %{{[0-9]+}})
915// CHECK-LE: call <4 x float> @llvm.sqrt.v4f32(<4 x float> %{{[0-9]+}})
916
917  res_vd = vec_sqrt(vd);
918// CHECK: call <2 x double> @llvm.sqrt.v2f64(<2 x double> %{{[0-9]+}})
919// CHECK-LE: call <2 x double> @llvm.sqrt.v2f64(<2 x double> %{{[0-9]+}})
920
921  res_vd = vec_sub(vd, vd);
922// CHECK: fsub <2 x double> %{{[0-9]+}}, %{{[0-9]+}}
923// CHECK-LE: fsub <2 x double> %{{[0-9]+}}, %{{[0-9]+}}
924
925  res_vf = vec_trunc(vf);
926// CHECK: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{[0-9]+}})
927// CHECK-LE: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{[0-9]+}})
928
929  res_vd = vec_trunc(vd);
930// CHECK: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{[0-9]+}})
931// CHECK-LE: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{[0-9]+}})
932
933  /* vec_vor */
934  res_vsll = vec_vor(vsll, vsll);
935// CHECK: or <2 x i64>
936// CHECK-LE: or <2 x i64>
937
938  res_vsll = vec_vor(vbll, vsll);
939// CHECK: or <2 x i64>
940// CHECK-LE: or <2 x i64>
941
942  res_vsll = vec_vor(vsll, vbll);
943// CHECK: or <2 x i64>
944// CHECK-LE: or <2 x i64>
945
946  res_vull = vec_vor(vull, vull);
947// CHECK: or <2 x i64>
948// CHECK-LE: or <2 x i64>
949
950  res_vull = vec_vor(vbll, vull);
951// CHECK: or <2 x i64>
952// CHECK-LE: or <2 x i64>
953
954  res_vull = vec_vor(vull, vbll);
955// CHECK: or <2 x i64>
956// CHECK-LE: or <2 x i64>
957
958  res_vbll = vec_vor(vbll, vbll);
959// CHECK: or <2 x i64>
960// CHECK-LE: or <2 x i64>
961
962  /* vec_xor */
963  res_vsll = vec_xor(vsll, vsll);
964// CHECK: xor <2 x i64>
965// CHECK-LE: xor <2 x i64>
966
967  res_vsll = vec_xor(vbll, vsll);
968// CHECK: xor <2 x i64>
969// CHECK-LE: xor <2 x i64>
970
971  res_vsll = vec_xor(vsll, vbll);
972// CHECK: xor <2 x i64>
973// CHECK-LE: xor <2 x i64>
974
975  res_vull = vec_xor(vull, vull);
976// CHECK: xor <2 x i64>
977// CHECK-LE: xor <2 x i64>
978
979  res_vull = vec_xor(vbll, vull);
980// CHECK: xor <2 x i64>
981// CHECK-LE: xor <2 x i64>
982
983  res_vull = vec_xor(vull, vbll);
984// CHECK: xor <2 x i64>
985// CHECK-LE: xor <2 x i64>
986
987  res_vbll = vec_xor(vbll, vbll);
988// CHECK: xor <2 x i64>
989// CHECK-LE: xor <2 x i64>
990
991  dummy();
992// CHECK: call void @dummy()
993// CHECK-LE: call void @dummy()
994
995  res_vd = vec_xor(vd, vd);
996// CHECK: [[X1:%.+]] = xor <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
997// CHECK: bitcast <2 x i64> [[X1]] to <2 x double>
998// CHECK-LE: [[X1:%.+]] = xor <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
999// CHECK-LE: bitcast <2 x i64> [[X1]] to <2 x double>
1000
1001  dummy();
1002// CHECK: call void @dummy()
1003// CHECK-LE: call void @dummy()
1004
1005  res_vd = vec_xor(vd, vbll);
1006// CHECK: [[X1:%.+]] = xor <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
1007// CHECK: bitcast <2 x i64> [[X1]] to <2 x double>
1008// CHECK-LE: [[X1:%.+]] = xor <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
1009// CHECK-LE: bitcast <2 x i64> [[X1]] to <2 x double>
1010
1011  dummy();
1012// CHECK: call void @dummy()
1013// CHECK-LE: call void @dummy()
1014
1015  res_vd = vec_xor(vbll, vd);
1016// CHECK: [[X1:%.+]] = xor <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
1017// CHECK: bitcast <2 x i64> [[X1]] to <2 x double>
1018// CHECK-LE: [[X1:%.+]] = xor <2 x i64> %{{[0-9]+}}, %{{[0-9]+}}
1019// CHECK-LE: bitcast <2 x i64> [[X1]] to <2 x double>
1020
1021  /* vec_vxor */
1022  res_vsll = vec_vxor(vsll, vsll);
1023// CHECK: xor <2 x i64>
1024// CHECK-LE: xor <2 x i64>
1025
1026  res_vsll = vec_vxor(vbll, vsll);
1027// CHECK: xor <2 x i64>
1028// CHECK-LE: xor <2 x i64>
1029
1030  res_vsll = vec_vxor(vsll, vbll);
1031// CHECK: xor <2 x i64>
1032// CHECK-LE: xor <2 x i64>
1033
1034  res_vull = vec_vxor(vull, vull);
1035// CHECK: xor <2 x i64>
1036// CHECK-LE: xor <2 x i64>
1037
1038  res_vull = vec_vxor(vbll, vull);
1039// CHECK: xor <2 x i64>
1040// CHECK-LE: xor <2 x i64>
1041
1042  res_vull = vec_vxor(vull, vbll);
1043// CHECK: xor <2 x i64>
1044// CHECK-LE: xor <2 x i64>
1045
1046  res_vbll = vec_vxor(vbll, vbll);
1047// CHECK: xor <2 x i64>
1048// CHECK-LE: xor <2 x i64>
1049
1050  res_vsll = vec_cts(vd, 0);
1051// CHECK: fmul <2 x double>
1052// CHECK: fptosi <2 x double> %{{.*}} to <2 x i64>
1053// CHECK-LE: fmul <2 x double>
1054// CHECK-LE: fptosi <2 x double> %{{.*}} to <2 x i64>
1055
1056  res_vsll = vec_cts(vd, 31);
1057// CHECK: fmul <2 x double>
1058// CHECK: fptosi <2 x double> %{{.*}} to <2 x i64>
1059// CHECK-LE: fmul <2 x double>
1060// CHECK-LE: fptosi <2 x double> %{{.*}} to <2 x i64>
1061
1062  res_vsll = vec_ctu(vd, 0);
1063// CHECK: fmul <2 x double>
1064// CHECK: fptoui <2 x double> %{{.*}} to <2 x i64>
1065// CHECK-LE: fmul <2 x double>
1066// CHECK-LE: fptoui <2 x double> %{{.*}} to <2 x i64>
1067
1068  res_vsll = vec_ctu(vd, 31);
1069// CHECK: fmul <2 x double>
1070// CHECK: fptoui <2 x double> %{{.*}} to <2 x i64>
1071// CHECK-LE: fmul <2 x double>
1072// CHECK-LE: fptoui <2 x double> %{{.*}} to <2 x i64>
1073
1074  res_vd = vec_ctf(vsll, 0);
1075// CHECK: sitofp <2 x i64> %{{.*}} to <2 x double>
1076// CHECK: fmul <2 x double>
1077// CHECK-LE: sitofp <2 x i64> %{{.*}} to <2 x double>
1078// CHECK-LE: fmul <2 x double>
1079
1080  res_vd = vec_ctf(vsll, 31);
1081// CHECK: sitofp <2 x i64> %{{.*}} to <2 x double>
1082// CHECK: fmul <2 x double>
1083// CHECK-LE: sitofp <2 x i64> %{{.*}} to <2 x double>
1084// CHECK-LE: fmul <2 x double>
1085
1086  res_vd = vec_ctf(vull, 0);
1087// CHECK: uitofp <2 x i64> %{{.*}} to <2 x double>
1088// CHECK: fmul <2 x double>
1089// CHECK-LE: uitofp <2 x i64> %{{.*}} to <2 x double>
1090// CHECK-LE: fmul <2 x double>
1091
1092  res_vd = vec_ctf(vull, 31);
1093// CHECK: uitofp <2 x i64> %{{.*}} to <2 x double>
1094// CHECK: fmul <2 x double>
1095// CHECK-LE: uitofp <2 x i64> %{{.*}} to <2 x double>
1096// CHECK-LE: fmul <2 x double>
1097
1098  res_vsll = vec_signed(vd);
1099// CHECK: fptosi <2 x double>
1100// CHECK-LE: fptosi <2 x double>
1101
1102  res_vsi = vec_signed2(vd, vd);
1103// CHECK: extractelement <2 x double>
1104// CHECK: fptosi double
1105// CHECK: insertelement <4 x i32>
1106// CHECK: extractelement <2 x double>
1107// CHECK: fptosi double
1108// CHECK: insertelement <4 x i32>
1109// CHECK: extractelement <2 x double>
1110// CHECK: fptosi double
1111// CHECK: insertelement <4 x i32>
1112// CHECK: extractelement <2 x double>
1113// CHECK: fptosi double
1114// CHECK: insertelement <4 x i32>
1115// CHECK-LE: extractelement <2 x double>
1116// CHECK-LE: fptosi double
1117// CHECK-LE: insertelement <4 x i32>
1118// CHECK-LE: extractelement <2 x double>
1119// CHECK-LE: fptosi double
1120// CHECK-LE: insertelement <4 x i32>
1121// CHECK-LE: extractelement <2 x double>
1122// CHECK-LE: fptosi double
1123// CHECK-LE: insertelement <4 x i32>
1124// CHECK-LE: extractelement <2 x double>
1125// CHECK-LE: fptosi double
1126// CHECK-LE: insertelement <4 x i32>
1127
1128  res_vsi = vec_signede(vd);
1129// CHECK: @llvm.ppc.vsx.xvcvdpsxws(<2 x double>
1130// CHECK-LE: @llvm.ppc.vsx.xvcvdpsxws(<2 x double>
1131// CHECK-LE: sub nsw i32 16
1132// CHECK-LE: sub nsw i32 17
1133// CHECK-LE: sub nsw i32 18
1134// CHECK-LE: sub nsw i32 31
1135// CHECK-LE: @llvm.ppc.altivec.vperm
1136
1137  res_vsi = vec_signedo(vd);
1138// CHECK: @llvm.ppc.vsx.xvcvdpsxws(<2 x double>
1139// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1140// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1141// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1142// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1143// CHECK: @llvm.ppc.altivec.vperm
1144// CHECK-LE: @llvm.ppc.vsx.xvcvdpsxws(<2 x double>
1145
1146  res_vull = vec_unsigned(vd);
1147// CHECK: fptoui <2 x double>
1148// CHECK-LE: fptoui <2 x double>
1149
1150  res_vui = vec_unsigned2(vd, vd);
1151// CHECK: extractelement <2 x double>
1152// CHECK: fptoui double
1153// CHECK: insertelement <4 x i32>
1154// CHECK: extractelement <2 x double>
1155// CHECK: fptoui double
1156// CHECK: insertelement <4 x i32>
1157// CHECK: extractelement <2 x double>
1158// CHECK: fptoui double
1159// CHECK: insertelement <4 x i32>
1160// CHECK: extractelement <2 x double>
1161// CHECK: fptoui double
1162// CHECK: insertelement <4 x i32>
1163// CHECK-LE: extractelement <2 x double>
1164// CHECK-LE: fptoui double
1165// CHECK-LE: insertelement <4 x i32>
1166// CHECK-LE: extractelement <2 x double>
1167// CHECK-LE: fptoui double
1168// CHECK-LE: insertelement <4 x i32>
1169// CHECK-LE: extractelement <2 x double>
1170// CHECK-LE: fptoui double
1171// CHECK-LE: insertelement <4 x i32>
1172// CHECK-LE: extractelement <2 x double>
1173// CHECK-LE: fptoui double
1174// CHECK-LE: insertelement <4 x i32>
1175
1176  res_vui = vec_unsignede(vd);
1177// CHECK: @llvm.ppc.vsx.xvcvdpuxws(<2 x double>
1178// CHECK-LE: @llvm.ppc.vsx.xvcvdpuxws(<2 x double>
1179// CHECK-LE: sub nsw i32 16
1180// CHECK-LE: sub nsw i32 17
1181// CHECK-LE: sub nsw i32 18
1182// CHECK-LE: sub nsw i32 31
1183// CHECK-LE: @llvm.ppc.altivec.vperm
1184
1185  res_vui = vec_unsignedo(vd);
1186// CHECK: @llvm.ppc.vsx.xvcvdpuxws(<2 x double>
1187// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1188// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1189// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1190// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1191// CHECK: @llvm.ppc.altivec.vperm
1192// CHECK-LE: @llvm.ppc.vsx.xvcvdpuxws(<2 x double>
1193
1194  res_vf = vec_float2(vsll, vsll);
1195// CHECK: extractelement <2 x i64>
1196// CHECK: sitofp i64
1197// CHECK: insertelement <4 x float>
1198// CHECK: extractelement <2 x i64>
1199// CHECK: sitofp i64
1200// CHECK: insertelement <4 x float>
1201// CHECK: extractelement <2 x i64>
1202// CHECK: sitofp i64
1203// CHECK: insertelement <4 x float>
1204// CHECK: extractelement <2 x i64>
1205// CHECK: sitofp i64
1206// CHECK: insertelement <4 x float>
1207// CHECK-LE: extractelement <2 x i64>
1208// CHECK-LE: sitofp i64
1209// CHECK-LE: insertelement <4 x float>
1210// CHECK-LE: extractelement <2 x i64>
1211// CHECK-LE: sitofp i64
1212// CHECK-LE: insertelement <4 x float>
1213// CHECK-LE: extractelement <2 x i64>
1214// CHECK-LE: sitofp i64
1215// CHECK-LE: insertelement <4 x float>
1216// CHECK-LE: extractelement <2 x i64>
1217// CHECK-LE: sitofp i64
1218// CHECK-LE: insertelement <4 x float>
1219
1220  res_vf = vec_float2(vull, vull);
1221// CHECK: extractelement <2 x i64>
1222// CHECK: uitofp i64
1223// CHECK: insertelement <4 x float>
1224// CHECK: extractelement <2 x i64>
1225// CHECK: uitofp i64
1226// CHECK: insertelement <4 x float>
1227// CHECK: extractelement <2 x i64>
1228// CHECK: uitofp i64
1229// CHECK: insertelement <4 x float>
1230// CHECK: extractelement <2 x i64>
1231// CHECK: uitofp i64
1232// CHECK: insertelement <4 x float>
1233// CHECK-LE: extractelement <2 x i64>
1234// CHECK-LE: uitofp i64
1235// CHECK-LE: insertelement <4 x float>
1236// CHECK-LE: extractelement <2 x i64>
1237// CHECK-LE: uitofp i64
1238// CHECK-LE: insertelement <4 x float>
1239// CHECK-LE: extractelement <2 x i64>
1240// CHECK-LE: uitofp i64
1241// CHECK-LE: insertelement <4 x float>
1242// CHECK-LE: extractelement <2 x i64>
1243// CHECK-LE: uitofp i64
1244// CHECK-LE: insertelement <4 x float>
1245
1246  res_vf = vec_float2(vd, vd);
1247// CHECK: extractelement <2 x double>
1248// CHECK: fptrunc double
1249// CHECK: insertelement <4 x float>
1250// CHECK: extractelement <2 x double>
1251// CHECK: fptrunc double
1252// CHECK: insertelement <4 x float>
1253// CHECK: extractelement <2 x double>
1254// CHECK: fptrunc double
1255// CHECK: insertelement <4 x float>
1256// CHECK: extractelement <2 x double>
1257// CHECK: fptrunc double
1258// CHECK: insertelement <4 x float>
1259// CHECK-LE: extractelement <2 x double>
1260// CHECK-LE: fptrunc double
1261// CHECK-LE: insertelement <4 x float>
1262// CHECK-LE: extractelement <2 x double>
1263// CHECK-LE: fptrunc double
1264// CHECK-LE: insertelement <4 x float>
1265// CHECK-LE: extractelement <2 x double>
1266// CHECK-LE: fptrunc double
1267// CHECK-LE: insertelement <4 x float>
1268// CHECK-LE: extractelement <2 x double>
1269// CHECK-LE: fptrunc double
1270// CHECK-LE: insertelement <4 x float>
1271
1272  res_vf = vec_floate(vsll);
1273// CHECK: @llvm.ppc.vsx.xvcvsxdsp
1274// CHECK-LE: @llvm.ppc.vsx.xvcvsxdsp
1275// CHECK-LE: sub nsw i32 16
1276// CHECK-LE: sub nsw i32 17
1277// CHECK-LE: sub nsw i32 18
1278// CHECK-LE: sub nsw i32 31
1279// CHECK-LE: @llvm.ppc.altivec.vperm
1280
1281  res_vf = vec_floate(vull);
1282// CHECK: @llvm.ppc.vsx.xvcvuxdsp
1283// CHECK-LE: @llvm.ppc.vsx.xvcvuxdsp
1284// CHECK-LE: sub nsw i32 16
1285// CHECK-LE: sub nsw i32 17
1286// CHECK-LE: sub nsw i32 18
1287// CHECK-LE: sub nsw i32 31
1288// CHECK-LE: @llvm.ppc.altivec.vperm
1289
1290  res_vf = vec_floate(vd);
1291// CHECK: @llvm.ppc.vsx.xvcvdpsp
1292// CHECK-LE: @llvm.ppc.vsx.xvcvdpsp
1293// CHECK-LE: sub nsw i32 16
1294// CHECK-LE: sub nsw i32 17
1295// CHECK-LE: sub nsw i32 18
1296// CHECK-LE: sub nsw i32 31
1297// CHECK-LE: @llvm.ppc.altivec.vperm
1298
1299  res_vf = vec_floato(vsll);
1300// CHECK: @llvm.ppc.vsx.xvcvsxdsp
1301// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1302// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1303// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1304// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1305// CHECK: @llvm.ppc.altivec.vperm
1306// CHECK-LE: @llvm.ppc.vsx.xvcvsxdsp
1307
1308  res_vf = vec_floato(vull);
1309// CHECK: @llvm.ppc.vsx.xvcvuxdsp
1310// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1311// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1312// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1313// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1314// CHECK: @llvm.ppc.altivec.vperm
1315// CHECK-LE: @llvm.ppc.vsx.xvcvuxdsp
1316
1317  res_vf = vec_floato(vd);
1318// CHECK: @llvm.ppc.vsx.xvcvdpsp
1319// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1320// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1321// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1322// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1323// CHECK: @llvm.ppc.altivec.vperm
1324// CHECK-LE: @llvm.ppc.vsx.xvcvdpsp
1325
1326  res_vd = vec_double(vsll);
1327// CHECK: sitofp <2 x i64>
1328// CHECK-LE: sitofp <2 x i64>
1329
1330  res_vd = vec_double(vull);
1331// CHECK: uitofp <2 x i64>
1332// CHECK-LE: uitofp <2 x i64>
1333
1334  res_vd = vec_doublee(vsi);
1335// CHECK: @llvm.ppc.vsx.xvcvsxwdp(<4 x i32
1336// CHECK-LE: sub nsw i32 16
1337// CHECK-LE: sub nsw i32 17
1338// CHECK-LE: sub nsw i32 18
1339// CHECK-LE: sub nsw i32 31
1340// CHECK-LE: @llvm.ppc.altivec.vperm
1341// CHECK-LE: @llvm.ppc.vsx.xvcvsxwdp(<4 x i32
1342
1343  res_vd = vec_doublee(vui);
1344// CHECK: @llvm.ppc.vsx.xvcvuxwdp(<4 x i32
1345// CHECK-LE: sub nsw i32 16
1346// CHECK-LE: sub nsw i32 17
1347// CHECK-LE: sub nsw i32 18
1348// CHECK-LE: sub nsw i32 31
1349// CHECK-LE: @llvm.ppc.altivec.vperm
1350// CHECK-LE: @llvm.ppc.vsx.xvcvuxwdp(<4 x i32
1351
1352  res_vd = vec_doublee(vf);
1353// CHECK: @llvm.ppc.vsx.xvcvspdp(<4 x float
1354// CHECK-LE: sub nsw i32 16
1355// CHECK-LE: sub nsw i32 17
1356// CHECK-LE: sub nsw i32 18
1357// CHECK-LE: sub nsw i32 31
1358// CHECK-LE: @llvm.ppc.altivec.vperm
1359// CHECK-LE: @llvm.ppc.vsx.xvcvspdp(<4 x float
1360
1361  res_vd = vec_doubleh(vsi);
1362// CHECK: extractelement <4 x i32>
1363// CHECK: sitofp i32
1364// CHECK: insertelement <2 x double>
1365// CHECK: extractelement <4 x i32>
1366// CHECK: sitofp i32
1367// CHECK: insertelement <2 x double>
1368// CHECK-LE: extractelement <4 x i32>
1369// CHECK-LE: sitofp i32
1370// CHECK-LE: insertelement <2 x double>
1371// CHECK-LE: extractelement <4 x i32>
1372// CHECK-LE: sitofp i32
1373// CHECK-LE: insertelement <2 x double>
1374
1375  res_vd = vec_doubleh(vui);
1376// CHECK: extractelement <4 x i32>
1377// CHECK: uitofp i32
1378// CHECK: insertelement <2 x double>
1379// CHECK: extractelement <4 x i32>
1380// CHECK: uitofp i32
1381// CHECK: insertelement <2 x double>
1382// CHECK-LE: extractelement <4 x i32>
1383// CHECK-LE: uitofp i32
1384// CHECK-LE: insertelement <2 x double>
1385// CHECK-LE: extractelement <4 x i32>
1386// CHECK-LE: uitofp i32
1387// CHECK-LE: insertelement <2 x double>
1388
1389  res_vd = vec_doubleh(vf);
1390// CHECK: extractelement <4 x float>
1391// CHECK: fpext float
1392// CHECK: insertelement <2 x double>
1393// CHECK: extractelement <4 x float>
1394// CHECK: fpext float
1395// CHECK: insertelement <2 x double>
1396// CHECK-LE: extractelement <4 x float>
1397// CHECK-LE: fpext float
1398// CHECK-LE: insertelement <2 x double>
1399// CHECK-LE: extractelement <4 x float>
1400// CHECK-LE: fpext float
1401// CHECK-LE: insertelement <2 x double>
1402
1403  res_vd = vec_doublel(vsi);
1404// CHECK: extractelement <4 x i32>
1405// CHECK: sitofp i32
1406// CHECK: insertelement <2 x double>
1407// CHECK: extractelement <4 x i32>
1408// CHECK: sitofp i32
1409// CHECK: insertelement <2 x double>
1410// CHECK-LE: extractelement <4 x i32>
1411// CHECK-LE: sitofp i32
1412// CHECK-LE: insertelement <2 x double>
1413// CHECK-LE: extractelement <4 x i32>
1414// CHECK-LE: sitofp i32
1415// CHECK-LE: insertelement <2 x double>
1416
1417  res_vd = vec_doublel(vui);
1418// CHECK: extractelement <4 x i32>
1419// CHECK: uitofp i32
1420// CHECK: insertelement <2 x double>
1421// CHECK: extractelement <4 x i32>
1422// CHECK: uitofp i32
1423// CHECK: insertelement <2 x double>
1424// CHECK-LE: extractelement <4 x i32>
1425// CHECK-LE: uitofp i32
1426// CHECK-LE: insertelement <2 x double>
1427// CHECK-LE: extractelement <4 x i32>
1428// CHECK-LE: uitofp i32
1429// CHECK-LE: insertelement <2 x double>
1430
1431  res_vd = vec_doublel(vf);
1432// CHECK: extractelement <4 x float>
1433// CHECK: fpext float
1434// CHECK: insertelement <2 x double>
1435// CHECK: extractelement <4 x float>
1436// CHECK: fpext float
1437// CHECK: insertelement <2 x double>
1438// CHECK-LE: extractelement <4 x float>
1439// CHECK-LE: fpext float
1440// CHECK-LE: insertelement <2 x double>
1441// CHECK-LE: extractelement <4 x float>
1442// CHECK-LE: fpext float
1443// CHECK-LE: insertelement <2 x double>
1444
1445  res_vd = vec_doubleo(vsi);
1446// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1447// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1448// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1449// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1450// CHECK: @llvm.ppc.altivec.vperm
1451// CHECK: @llvm.ppc.vsx.xvcvsxwdp(<4 x i32>
1452// CHECK-LE: @llvm.ppc.vsx.xvcvsxwdp(<4 x i32>
1453
1454  res_vd = vec_doubleo(vui);
1455// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1456// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1457// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1458// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1459// CHECK: @llvm.ppc.altivec.vperm
1460// CHECK: @llvm.ppc.vsx.xvcvuxwdp(<4 x i32>
1461// CHECK-LE: @llvm.ppc.vsx.xvcvuxwdp(<4 x i32>
1462
1463  res_vd = vec_doubleo(vf);
1464// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1465// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1466// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1467// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1468// CHECK: @llvm.ppc.altivec.vperm
1469// CHECK: @llvm.ppc.vsx.xvcvspdp(<4 x float>
1470// CHECK-LE: @llvm.ppc.vsx.xvcvspdp(<4 x float>
1471
1472  res_vbll = vec_reve(vbll);
1473// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1474// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1475
1476  res_vsll = vec_reve(vsll);
1477// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1478// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1479
1480  res_vull = vec_reve(vull);
1481// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1482// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1483
1484  res_vd = vec_reve(vd);
1485// CHECK: shufflevector <2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1486// CHECK-LE: shufflevector <2 x double> %{{[0-9]+}}, <2 x double> %{{[0-9]+}}, <2 x i32> <i32 1, i32 0>
1487
1488  res_vbll = vec_revb(vbll);
1489// CHECK: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1490// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1491// CHECK-LE: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1492// CHECK-LE: store <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8>* {{%.+}}, align 16
1493// CHECK-LE: xor <16 x i8>
1494// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1495
1496  res_vsll = vec_revb(vsll);
1497// CHECK: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1498// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1499// CHECK-LE: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1500// CHECK-LE: store <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8>* {{%.+}}, align 16
1501// CHECK-LE: xor <16 x i8>
1502// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1503
1504  res_vull = vec_revb(vull);
1505// CHECK: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1506// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1507// CHECK-LE: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1508// CHECK-LE: store <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8>* {{%.+}}, align 16
1509// CHECK-LE: xor <16 x i8>
1510// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1511
1512  res_vd = vec_revb(vd);
1513// CHECK: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1514// CHECK: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1515// CHECK-LE: store <16 x i8> <i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8>, <16 x i8>* {{%.+}}, align 16
1516// CHECK-LE: store <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8>* {{%.+}}, align 16
1517// CHECK-LE: xor <16 x i8>
1518// CHECK-LE: call <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32> {{%.+}}, <4 x i32> {{%.+}}, <16 x i8> {{%.+}})
1519
1520  res_vbll = vec_sld(vbll, vbll, 0);
1521// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1522// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1523// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1524// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1525// CHECK: @llvm.ppc.altivec.vperm
1526// CHECK-LE: sub nsw i32 16
1527// CHECK-LE: sub nsw i32 17
1528// CHECK-LE: sub nsw i32 18
1529// CHECK-LE: sub nsw i32 31
1530// CHECK-LE: @llvm.ppc.altivec.vperm
1531
1532  res_vsll = vec_sld(vsll, vsll, 0);
1533// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1534// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1535// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1536// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1537// CHECK: @llvm.ppc.altivec.vperm
1538// CHECK-LE: sub nsw i32 16
1539// CHECK-LE: sub nsw i32 17
1540// CHECK-LE: sub nsw i32 18
1541// CHECK-LE: sub nsw i32 31
1542// CHECK-LE: @llvm.ppc.altivec.vperm
1543
1544  res_vull = vec_sld(vull, vull, 0);
1545// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1546// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1547// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1548// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1549// CHECK: @llvm.ppc.altivec.vperm
1550// CHECK-LE: sub nsw i32 16
1551// CHECK-LE: sub nsw i32 17
1552// CHECK-LE: sub nsw i32 18
1553// CHECK-LE: sub nsw i32 31
1554// CHECK-LE: @llvm.ppc.altivec.vperm
1555
1556  res_vd = vec_sld(vd, vd, 0);
1557// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1558// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1559// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1560// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1561// CHECK: @llvm.ppc.altivec.vperm
1562// CHECK-LE: sub nsw i32 16
1563// CHECK-LE: sub nsw i32 17
1564// CHECK-LE: sub nsw i32 18
1565// CHECK-LE: sub nsw i32 31
1566// CHECK-LE: @llvm.ppc.altivec.vperm
1567
1568  res_vsll = vec_sldw(vsll, vsll, 0);
1569// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1570// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1571// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1572// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1573// CHECK: @llvm.ppc.altivec.vperm
1574// CHECK-LE: sub nsw i32 16
1575// CHECK-LE: sub nsw i32 17
1576// CHECK-LE: sub nsw i32 18
1577// CHECK-LE: sub nsw i32 31
1578// CHECK-LE: @llvm.ppc.altivec.vperm
1579
1580  res_vull = vec_sldw(vull, vull, 0);
1581// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 1
1582// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 2
1583// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 3
1584// CHECK: add nsw i32 {{[0-9a-zA-Z%.]+}}, 15
1585// CHECK: @llvm.ppc.altivec.vperm
1586// CHECK-LE: sub nsw i32 16
1587// CHECK-LE: sub nsw i32 17
1588// CHECK-LE: sub nsw i32 18
1589// CHECK-LE: sub nsw i32 31
1590// CHECK-LE: @llvm.ppc.altivec.vperm
1591
1592  res_vsll = vec_sll(vsll, vuc);
1593// CHECK: @llvm.ppc.altivec.vsl
1594// CHECK-LE: @llvm.ppc.altivec.vsl
1595
1596res_vull = vec_sll(vull, vuc);
1597// CHECK: @llvm.ppc.altivec.vsl
1598// CHECK-LE: @llvm.ppc.altivec.vsl
1599
1600res_vsll = vec_slo(vsll, vsc);
1601// CHECK: @llvm.ppc.altivec.vslo
1602// CHECK-LE: @llvm.ppc.altivec.vslo
1603
1604  res_vsll = vec_slo(vsll, vuc);
1605// CHECK: @llvm.ppc.altivec.vslo
1606// CHECK-LE: @llvm.ppc.altivec.vslo
1607
1608  res_vull = vec_slo(vull, vsc);
1609// CHECK: @llvm.ppc.altivec.vslo
1610// CHECK-LE: @llvm.ppc.altivec.vslo
1611
1612  res_vull = vec_slo(vull, vuc);
1613// CHECK: @llvm.ppc.altivec.vslo
1614// CHECK-LE: @llvm.ppc.altivec.vslo
1615
1616  res_vsll = vec_srl(vsll, vuc);
1617// CHECK: @llvm.ppc.altivec.vsr
1618// CHECK-LE: @llvm.ppc.altivec.vsr
1619
1620  res_vull = vec_srl(vull, vuc);
1621// CHECK: @llvm.ppc.altivec.vsr
1622// CHECK-LE: @llvm.ppc.altivec.vsr
1623
1624  res_vsll = vec_sro(vsll, vsc);
1625// CHECK: @llvm.ppc.altivec.vsro
1626// CHECK-LE: @llvm.ppc.altivec.vsro
1627
1628  res_vsll = vec_sro(vsll, vuc);
1629// CHECK: @llvm.ppc.altivec.vsro
1630// CHECK-LE: @llvm.ppc.altivec.vsro
1631
1632  res_vull = vec_sro(vull, vsc);
1633// CHECK: @llvm.ppc.altivec.vsro
1634// CHECK-LE: @llvm.ppc.altivec.vsro
1635
1636  res_vull = vec_sro(vull, vuc);
1637// CHECK: @llvm.ppc.altivec.vsro
1638// CHECK-LE: @llvm.ppc.altivec.vsro
1639
1640res_vsll = vec_xl(sll, asll);
1641// CHECK: load <2 x i64>, <2 x i64>* %{{[0-9]+}}, align 1
1642// CHECK-LE: load <2 x i64>, <2 x i64>* %{{[0-9]+}}, align 1
1643
1644res_vull = vec_xl(sll, aull);
1645// CHECK: load <2 x i64>, <2 x i64>* %{{[0-9]+}}, align 1
1646// CHECK-LE: load <2 x i64>, <2 x i64>* %{{[0-9]+}}, align 1
1647
1648res_vd = vec_xl(sll, ad);
1649// CHECK: load <2 x double>, <2 x double>* %{{[0-9]+}}, align 1
1650// CHECK-LE: load <2 x double>, <2 x double>* %{{[0-9]+}}, align 1
1651
1652vec_xst(vsll, sll, asll);
1653// CHECK: store <2 x i64> %{{[0-9]+}}, <2 x i64>* %{{[0-9]+}}, align 1
1654// CHECK-LE: store <2 x i64> %{{[0-9]+}}, <2 x i64>* %{{[0-9]+}}, align 1
1655
1656vec_xst(vull, sll, aull);
1657// CHECK: store <2 x i64> %{{[0-9]+}}, <2 x i64>* %{{[0-9]+}}, align 1
1658// CHECK-LE: store <2 x i64> %{{[0-9]+}}, <2 x i64>* %{{[0-9]+}}, align 1
1659
1660vec_xst(vd, sll, ad);
1661// CHECK: store <2 x double> %{{[0-9]+}}, <2 x double>* %{{[0-9]+}}, align 1
1662// CHECK-LE: store <2 x double> %{{[0-9]+}}, <2 x double>* %{{[0-9]+}}, align 1
1663
1664res_vsll = vec_xl_be(sll, asll);
1665// CHECK: load <2 x i64>, <2 x i64>* %{{[0-9]+}}, align 1
1666// CHECK-LE: call <2 x double> @llvm.ppc.vsx.lxvd2x.be(i8* %{{[0-9]+}})
1667
1668res_vull = vec_xl_be(sll, aull);
1669// CHECK: load <2 x i64>, <2 x i64>* %{{[0-9]+}}, align 1
1670// CHECK-LE: call <2 x double> @llvm.ppc.vsx.lxvd2x.be(i8* %{{[0-9]+}})
1671
1672res_vd = vec_xl_be(sll, ad);
1673// CHECK: load <2 x double>, <2 x double>* %{{[0-9]+}}, align 1
1674// CHECK-LE: call <2 x double> @llvm.ppc.vsx.lxvd2x.be(i8* %{{[0-9]+}})
1675
1676vec_xst_be(vsll, sll, asll);
1677// CHECK: store <2 x i64> %{{[0-9]+}}, <2 x i64>* %{{[0-9]+}}, align 1
1678// CHECK-LE: call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %{{[0-9]+}}, i8* %{{[0-9]+}})
1679
1680vec_xst_be(vull, sll, aull);
1681// CHECK: store <2 x i64> %{{[0-9]+}}, <2 x i64>* %{{[0-9]+}}, align 1
1682// CHECK-LE: call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %{{[0-9]+}}, i8* %{{[0-9]+}})
1683
1684vec_xst_be(vd, sll, ad);
1685// CHECK: store <2 x double> %{{[0-9]+}}, <2 x double>* %{{[0-9]+}}, align 1
1686// CHECK-LE: call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %{{[0-9]+}}, i8* %{{[0-9]+}})
1687
1688  res_vf = vec_neg(vf);
1689// CHECK: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, {{%[0-9]+}}
1690// CHECK-LE: fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, {{%[0-9]+}}
1691
1692  res_vd = vec_neg(vd);
1693// CHECK: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, {{%[0-9]+}}
1694// CHECK-LE: fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, {{%[0-9]+}}
1695
1696res_vd = vec_xxpermdi(vd, vd, 0);
1697// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1698// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1699
1700res_vf = vec_xxpermdi(vf, vf, 1);
1701// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 3>
1702// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 3>
1703
1704res_vsll = vec_xxpermdi(vsll, vsll, 2);
1705// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 2>
1706// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 2>
1707
1708res_vull = vec_xxpermdi(vull, vull, 3);
1709// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 3>
1710// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 3>
1711
1712res_vsi = vec_xxpermdi(vsi, vsi, 0);
1713// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1714// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1715
1716res_vui = vec_xxpermdi(vui, vui, 1);
1717// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 3>
1718// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 3>
1719
1720res_vss = vec_xxpermdi(vss, vss, 2);
1721// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 2>
1722// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 2>
1723
1724res_vus = vec_xxpermdi(vus, vus, 3);
1725// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 3>
1726// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 1, i32 3>
1727
1728res_vsc = vec_xxpermdi(vsc, vsc, 0);
1729// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1730// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1731
1732res_vuc = vec_xxpermdi(vuc, vuc, 1);
1733// CHECK: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 3>
1734// CHECK-LE: shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 3>
1735
1736res_vd = vec_xxsldwi(vd, vd, 0);
1737// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1738// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1739
1740res_vf = vec_xxsldwi(vf, vf, 1);
1741// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
1742// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
1743
1744res_vsll = vec_xxsldwi(vsll, vsll, 2);
1745// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
1746// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1747
1748res_vull = vec_xxsldwi(vull, vull, 3);
1749// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
1750// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
1751
1752res_vsi = vec_xxsldwi(vsi, vsi, 0);
1753// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1754// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1755
1756res_vui = vec_xxsldwi(vui, vui, 1);
1757// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
1758// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
1759
1760res_vss = vec_xxsldwi(vss, vss, 2);
1761// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
1762// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1763
1764
1765res_vus = vec_xxsldwi(vus, vus, 3);
1766// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
1767// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
1768
1769res_vsc = vec_xxsldwi(vsc, vsc, 0);
1770// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1771// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1772
1773res_vuc = vec_xxsldwi(vuc, vuc, 1);
1774// CHECK: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
1775// CHECK-LE: shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
1776}
1777
1778// The return type of the call expression may be different from the return type of the shufflevector.
1779// Wrong implementation could crash the compiler, add this test case to check that and avoid ICE.
1780vector int xxpermdi_should_not_assert(vector int a, vector int b) {
1781  return vec_xxpermdi(a, b, 0);
1782// CHECK-LABEL: xxpermdi_should_not_assert
1783// CHECK:  bitcast <4 x i32> %{{[0-9]+}} to <2 x i64>
1784// CHECK-NEXT:  bitcast <4 x i32> %{{[0-9]+}} to <2 x i64>
1785// CHECK-NEXT:  shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1786// CHECK-NEXT:  bitcast <2 x i64> %{{[0-9]+}} to <4 x i32>
1787
1788// CHECK-LE:  bitcast <4 x i32> %{{[0-9]+}} to <2 x i64>
1789// CHECK-LE-NEXT:  bitcast <4 x i32> %{{[0-9]+}} to <2 x i64>
1790// CHECK-LE-NEXT:  shufflevector <2 x i64> %{{[0-9]+}}, <2 x i64> %{{[0-9]+}}, <2 x i32> <i32 0, i32 2>
1791// CHECK-LE-NEXT:  bitcast <2 x i64> %{{[0-9]+}} to <4 x i32>
1792}
1793
1794vector double xxsldwi_should_not_assert(vector double a, vector double b) {
1795  return vec_xxsldwi(a, b, 0);
1796// CHECK-LABEL: xxsldwi_should_not_assert
1797// CHECK:  bitcast <2 x double> %{{[0-9]+}} to <4 x i32>
1798// CHECK-NEXT:  bitcast <2 x double> %{{[0-9]+}} to <4 x i32>
1799// CHECK-NEXT:  shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1800// CHECK-NEXT:  bitcast <4 x i32> %{{[0-9]+}} to <2 x double>
1801
1802// CHECK-LE:  bitcast <2 x double> %{{[0-9]+}} to <4 x i32>
1803// CHECK-NEXT-LE:  bitcast <2 x double> %{{[0-9]+}} to <4 x i32>
1804// CHECK-NEXT-LE:  shufflevector <4 x i32> %{{[0-9]+}}, <4 x i32> %{{[0-9]+}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1805// CHECK-NEXT-LE:  bitcast <4 x i32> %{{[0-9]+}} to <2 x double>
1806}
1807
1808void testVectorInt128Pack(){
1809// CHECK-LABEL: testVectorInt128Pack
1810// CHECK-LABEL-LE: testVectorInt128Pack
1811  res_vslll = __builtin_pack_vector_int128(aull[0], aull[1]);
1812// CHECK: %[[V1:[0-9]+]] = insertelement <2 x i64> undef, i64 %{{[0-9]+}}, i64 0
1813// CHECK-NEXT: %[[V2:[0-9]+]] = insertelement <2 x i64> %[[V1]], i64 %{{[0-9]+}}, i64 1
1814// CHECK-NEXT:  bitcast <2 x i64> %[[V2]] to <1 x i128>
1815
1816// CHECK-LE: %[[V1:[0-9]+]] = insertelement <2 x i64> undef, i64 %{{[0-9]+}}, i64 1
1817// CHECK-NEXT-LE: %[[V2:[0-9]+]] = insertelement <2 x i64> %[[V1]], i64 %{{[0-9]+}}, i64 0
1818// CHECK-NEXT-LE:  bitcast <2 x i64> %[[V2]] to <1 x i128>
1819
1820  __builtin_unpack_vector_int128(res_vslll, 0);
1821// CHECK:  %[[V1:[0-9]+]] = bitcast <1 x i128> %{{[0-9]+}} to <2 x i64>
1822// CHECK-NEXT: %{{[0-9]+}} = extractelement <2 x i64> %[[V1]], i32 0
1823
1824// CHECK-LE:  %[[V1:[0-9]+]] = bitcast <1 x i128> %{{[0-9]+}} to <2 x i64>
1825// CHECK-NEXT-LE: %{{[0-9]+}} = extractelement <2 x i64> %[[V1]], i32 1
1826
1827  __builtin_unpack_vector_int128(res_vslll, 1);
1828// CHECK:  %[[V1:[0-9]+]] = bitcast <1 x i128> %{{[0-9]+}} to <2 x i64>
1829// CHECK-NEXT: %{{[0-9]+}} = extractelement <2 x i64> %[[V1]], i32 1
1830
1831// CHECK-LE:  %[[V1:[0-9]+]] = bitcast <1 x i128> %{{[0-9]+}} to <2 x i64>
1832// CHECK-NEXT-LE: %{{[0-9]+}} = extractelement <2 x i64> %[[V1]], i32 0
1833
1834}
1835