1 // REQUIRES: powerpc-registered-target
2 
3 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-linux-gnu -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \
4 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-BE
5 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-linux-gnu -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \
6 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-LE
7 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-linux-gnu -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \
8 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-BE
9 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-linux-gnu -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \
10 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n| FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-LE
11 
12 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-freebsd13.0 -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \
13 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-BE
14 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-freebsd13.0 -mcpu=pwr8 -DNO_WARN_X86_INTRINSICS %s \
15 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P8,CHECK,CHECK-LE
16 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64-unknown-freebsd13.0 -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \
17 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-BE
18 // RUN: %clang -Xclang -no-opaque-pointers -S -emit-llvm -target powerpc64le-unknown-freebsd13.0 -mcpu=pwr9 -DNO_WARN_X86_INTRINSICS %s \
19 // RUN:   -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n| FileCheck %s --check-prefixes=CHECK-P9,CHECK,CHECK-LE
20 
21 #include <mmintrin.h>
22 
23 unsigned long long int ull1, ull2;
24 int i1, i2;
25 short s[4];
26 signed char c[8];
27 long long int ll1;
28 __m64 m1, m2, res;
29 
30 void __attribute__((noinline))
31 test_add() {
32   res = _mm_add_pi32(m1, m2);
33   res = _mm_add_pi16(m1, m2);
34   res = _mm_add_pi8(m1, m2);
35   res = _mm_adds_pu16(m1, m2);
36   res = _mm_adds_pu8(m1, m2);
37   res = _mm_adds_pi16(m1, m2);
38   res = _mm_adds_pi8(m1, m2);
39 }
40 
41 // CHECK-LABEL: @test_add
42 
43 // CHECK-LABEL: define available_externally i64 @_mm_add_pi32
44 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
45 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
46 // CHECK-P9: call <4 x i32> @vec_add(int vector[4], int vector[4])
47 // CHECK-P8: add nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
48 // CHECK-P8: add nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
49 
50 // CHECK-LABEL: define available_externally i64 @_mm_add_pi16
51 // CHECK: call <2 x i64> @vec_splats
52 // CHECK: call <2 x i64> @vec_splats
53 // CHECK: call <8 x i16> @vec_add(short vector[8], short vector[8])
54 
55 // CHECK-LABEL: define available_externally i64 @_mm_add_pi8
56 // CHECK: call <2 x i64> @vec_splats
57 // CHECK: call <2 x i64> @vec_splats
58 // CHECK: call <16 x i8> @vec_add(signed char vector[16], signed char vector[16])
59 
60 // CHECK-LABEL: define available_externally i64 @_mm_adds_pu16
61 // CHECK: call <2 x i64> @vec_splats
62 // CHECK: call <2 x i64> @vec_splats
63 // CHECK: call <8 x i16> @vec_adds(unsigned short vector[8], unsigned short vector[8])
64 
65 // CHECK-LABEL: define available_externally i64 @_mm_adds_pu8
66 // CHECK: call <2 x i64> @vec_splats
67 // CHECK: call <2 x i64> @vec_splats
68 // CHECK: call <16 x i8> @vec_adds(unsigned char vector[16], unsigned char vector[16])
69 
70 // CHECK-LABEL: define available_externally i64 @_mm_adds_pi16
71 // CHECK: call <2 x i64> @vec_splats
72 // CHECK: call <2 x i64> @vec_splats
73 // CHECK: call <8 x i16> @vec_adds(short vector[8], short vector[8])
74 
75 // CHECK-LABEL: define available_externally i64 @_mm_adds_pi8
76 // CHECK: call <2 x i64> @vec_splats
77 // CHECK: call <2 x i64> @vec_splats
78 // CHECK: call <16 x i8> @vec_adds(signed char vector[16], signed char vector[16])
79 
80 void __attribute__((noinline))
81 test_alt_name_add() {
82   res = _m_paddb(m1, m2);
83   res = _m_paddd(m1, m2);
84   res = _m_paddsb(m1, m2);
85   res = _m_paddsw(m1, m2);
86   res = _m_paddusb(m1, m2);
87   res = _m_paddusw(m1, m2);
88   res = _m_paddw(m1, m2);
89 }
90 
91 // CHECK-LABEL: @test_alt_name_add
92 
93 // CHECK-LABEL: define available_externally i64 @_m_paddb
94 // CHECK: call i64 @_mm_add_pi8
95 
96 // CHECK-LABEL: define available_externally i64 @_m_paddd
97 // CHECK: call i64 @_mm_add_pi32
98 
99 // CHECK-LABEL: define available_externally i64 @_m_paddsb
100 // CHECK: call i64 @_mm_adds_pi8
101 
102 // CHECK-LABEL: define available_externally i64 @_m_paddsw
103 // CHECK: call i64 @_mm_adds_pi16
104 
105 // CHECK-LABEL: define available_externally i64 @_m_paddusb
106 // CHECK: call i64 @_mm_adds_pu8
107 
108 // CHECK-LABEL: define available_externally i64 @_m_paddusw
109 // CHECK: call i64 @_mm_adds_pu16
110 
111 // CHECK-LABEL: define available_externally i64 @_m_paddw
112 // CHECK: call i64 @_mm_add_pi16
113 
114 void __attribute__((noinline))
115 test_cmp() {
116   res = _mm_cmpeq_pi32(m1, m2);
117   res = _mm_cmpeq_pi16(m1, m2);
118   res = _mm_cmpeq_pi8(m1, m2);
119   res = _mm_cmpgt_pi32(m1, m2);
120   res = _mm_cmpgt_pi16(m1, m2);
121   res = _mm_cmpgt_pi8(m1, m2);
122 }
123 
124 // CHECK-LABEL: @test_cmp
125 
126 // CHECK-LABEL: define available_externally i64 @_mm_cmpeq_pi32
127 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
128 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
129 // CHECK-P9: call <4 x i32> @vec_cmpeq(int vector[4], int vector[4])
130 // CHECK-P8: %[[CMP1:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
131 // CHECK-P8: select i1 %[[CMP1]], i32 -1, i32 0
132 // CHECK-P8: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
133 // CHECK-P8: select i1 %[[CMP2]], i32 -1, i32 0
134 
135 // CHECK-LABEL: define available_externally i64 @_mm_cmpeq_pi16
136 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
137 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
138 // CHECK: call <8 x i16> @vec_cmpeq(short vector[8], short vector[8])
139 
140 // CHECK-LABEL: define available_externally i64 @_mm_cmpeq_pi8
141 // CHECK: call i64 asm "cmpb $0,$1,$2;\0A", "=r,r,r"
142 
143 // CHECK-LABEL: define available_externally i64 @_mm_cmpgt_pi32
144 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
145 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
146 // CHECK-P9: call <4 x i32> @vec_cmpgt(int vector[4], int vector[4])
147 // CHECK-P8: %[[CMP1:[0-9a-zA-Z_.]+]] = icmp sgt i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
148 // CHECK-P8: select i1 %[[CMP1]], i32 -1, i32 0
149 // CHECK-P8: [[CMP2:[0-9a-zA-Z_.]+]] = icmp sgt i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
150 // CHECK-P8: select i1 %[[CMP2]], i32 -1, i32 0
151 
152 // CHECK-LABEL: define available_externally i64 @_mm_cmpgt_pi16
153 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
154 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
155 // CHECK: call <8 x i16> @vec_cmpgt(short vector[8], short vector[8])
156 
157 // CHECK-LABEL: define available_externally i64 @_mm_cmpgt_pi8
158 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
159 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
160 // CHECK: call <16 x i8> @vec_cmpgt(signed char vector[16], signed char vector[16])
161 
162 void __attribute__((noinline))
163 test_alt_name_cmp() {
164   res = _m_pcmpeqb(m1, m2);
165   res = _m_pcmpeqd(m1, m2);
166   res = _m_pcmpeqw(m1, m2);
167   res = _m_pcmpgtb(m1, m2);
168   res = _m_pcmpgtd(m1, m2);
169   res = _m_pcmpgtw(m1, m2);
170 }
171 
172 // CHECK-LABEL: @test_alt_name_cmp
173 
174 // CHECK-LABEL: define available_externally i64 @_m_pcmpeqb
175 // CHECK: call i64 @_mm_cmpeq_pi8
176 
177 // CHECK-LABEL: define available_externally i64 @_m_pcmpeqd
178 // CHECK: call i64 @_mm_cmpeq_pi32
179 
180 // CHECK-LABEL: define available_externally i64 @_m_pcmpeqw
181 // CHECK: call i64 @_mm_cmpeq_pi16
182 
183 // CHECK-LABEL: define available_externally i64 @_m_pcmpgtb
184 // CHECK: call i64 @_mm_cmpgt_pi8
185 
186 // CHECK-LABEL: define available_externally i64 @_m_pcmpgtd
187 // CHECK: call i64 @_mm_cmpgt_pi32
188 
189 // CHECK-LABEL: define available_externally i64 @_m_pcmpgtw
190 // CHECK: call i64 @_mm_cmpgt_pi16
191 
192 void __attribute__((noinline))
193 test_convert() {
194   ll1 = _mm_cvtm64_si64(m1);
195   m1 = _mm_cvtsi32_si64(i1);
196   m1 = _mm_cvtsi64_m64(ll1);
197   i1 = _mm_cvtsi64_si32(m1);
198 }
199 
200 // CHECK-LABEL: @test_convert
201 
202 // CHECK-LABEL: define available_externally i64 @_mm_cvtm64_si64
203 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
204 // CHECK-NEXT: ret i64 %[[RESULT]]
205 
206 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi32_si64
207 // CHECK: %[[LOAD:[0-9a-zA-Z_.]+]] = load i32, i32* %{{[0-9a-zA-Z_.]+}}
208 // CHECK-NEXT: %[[RESULT:[0-9a-zA-Z_.]+]] = zext i32 %[[LOAD]] to i64
209 // CHECK-NEXT: ret i64 %[[RESULT]]
210 
211 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi64_m64
212 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
213 // CHECK-NEXT: ret i64 %[[RESULT]]
214 
215 // CHECK-LABEL: define available_externally signext i32 @_mm_cvtsi64_si32
216 // CHECK: %[[LOAD:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
217 // CHECK-NEXT: %[[RESULT:[0-9a-zA-Z_.]+]] = trunc i64 %[[LOAD]] to i32
218 // CHECK-NEXT: ret i32 %[[RESULT]]
219 
220 void __attribute__((noinline))
221 test_alt_name_convert() {
222   m1 = _m_from_int(i1);
223   m1 = _m_from_int64(ll1);
224   i1 = _m_to_int(m1);
225   ll1 = _m_to_int64(m1);
226 }
227 
228 // CHECK-LABEL: @test_alt_name_convert
229 
230 // CHECK-LABEL: define available_externally i64 @_m_from_int
231 // CHECK: call i64 @_mm_cvtsi32_si64
232 
233 // CHECK-LABEL: define available_externally i64 @_m_from_int64
234 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}
235 // CHECK-NEXT: ret i64 %[[RESULT]]
236 
237 // CHECK-LABEL: define available_externally signext i32 @_m_to_int
238 // CHECK: call signext i32 @_mm_cvtsi64_si32
239 
240 // CHECK-LABEL: define available_externally i64 @_m_to_int64
241 // CHECK: %[[RESULT:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}
242 // CHECK-NEXT: ret i64 %[[RESULT]]
243 
244 void __attribute__((noinline))
245 test_empty() {
246   _mm_empty();
247   _m_empty();
248 }
249 
250 // CHECK-LABEL: @test_empty
251 
252 // CHECK-LABEL: define available_externally void @_mm_empty
253 // CHECK-NEXT: entry
254 // CHECK-NEXT: ret void
255 
256 // CHECK-LABEL: define available_externally void @_m_empty
257 // CHECK-NEXT: entry
258 // CHECK-NEXT: ret void
259 
260 void __attribute__((noinline))
261 test_logic() {
262   res = _mm_and_si64(m1, m2);
263   res = _mm_andnot_si64(m1, m2);
264   res = _mm_or_si64(m1, m2);
265   res = _mm_xor_si64(m1, m2);
266 }
267 
268 // CHECK-LABEL: @test_logic
269 
270 // CHECK-LABEL: define available_externally i64 @_mm_and_si64
271 // CHECK: and i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
272 
273 // CHECK-LABEL: define available_externally i64 @_mm_andnot_si64
274 // CHECK: %[[XOR:[0-9a-zA-Z_.]+]] = xor i64 %{{[0-9a-zA-Z_.]+}}, -1
275 // CHECK: and i64 %[[XOR]], %{{[0-9a-zA-Z_.]+}}
276 
277 // CHECK-LABEL: define available_externally i64 @_mm_or_si64
278 // CHECK: or i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
279 
280 // CHECK-LABEL: define available_externally i64 @_mm_xor_si64
281 // CHECK: xor i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
282 
283 void __attribute__((noinline))
284 test_alt_name_logic() {
285   res = _m_pand(m1, m2);
286   res = _m_pandn(m1, m2);
287   res = _m_por(m1, m2);
288   res = _m_pxor(m1, m2);
289 }
290 
291 // CHECK-LABEL: @test_alt_name_logic
292 
293 // CHECK-LABEL: define available_externally i64 @_m_pand
294 // CHECK: call i64 @_mm_and_si64
295 
296 // CHECK-LABEL: define available_externally i64 @_m_pandn
297 // CHECK: call i64 @_mm_andnot_si64
298 
299 // CHECK-LABEL: define available_externally i64 @_m_por
300 // CHECK: call i64 @_mm_or_si64
301 
302 // CHECK-LABEL: define available_externally i64 @_m_pxor
303 // CHECK: call i64 @_mm_xor_si64
304 
305 void __attribute__((noinline))
306 test_madd() {
307   res = _mm_madd_pi16(m1, m2);
308   res = _m_pmaddwd(m1, m2);
309 }
310 
311 // CHECK-LABEL: @test_madd
312 
313 // CHECK-LABEL: define available_externally i64 @_mm_madd_pi16
314 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
315 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
316 // CHECK: call <4 x i32> @vec_vmsumshm
317 
318 // CHECK-LABEL: define available_externally i64 @_m_pmaddwd
319 // CHECK: call i64 @_mm_madd_pi16
320 
321 void __attribute__((noinline))
322 test_mul() {
323   res = _mm_mulhi_pi16(m1, m2);
324   res = _mm_mullo_pi16(m1, m2);
325 }
326 
327 // CHECK-LABEL: @test_mul
328 
329 // CHECK-LABEL: define available_externally i64 @_mm_mulhi_pi16
330 // CHECK-BE: store <16 x i8> <i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21, i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21>
331 // CHECK-LE: store <16 x i8> <i8 2, i8 3, i8 18, i8 19, i8 6, i8 7, i8 22, i8 23, i8 10, i8 11, i8 26, i8 27, i8 14, i8 15, i8 30, i8 31>
332 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
333 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
334 // CHECK: call <4 x i32> @vec_vmulesh
335 // CHECK: call <4 x i32> @vec_vmulosh
336 // CHECK: call <4 x i32> @vec_perm(int vector[4], int vector[4], unsigned char vector[16])
337 
338 // CHECK-LABEL: define available_externally i64 @_mm_mullo_pi16
339 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
340 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
341 // CHECK: mul <8 x i16> %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
342 
343 void __attribute__((noinline))
344 test_alt_name_mul() {
345   res = _m_pmulhw(m1, m2);
346   res = _m_pmullw(m1, m2);
347 }
348 
349 // CHECK-LABEL: @test_alt_name_mul
350 
351 // CHECK-LABEL: define available_externally i64 @_m_pmulhw
352 // CHECK: call i64 @_mm_mulhi_pi16
353 
354 // CHECK-LABEL: define available_externally i64 @_m_pmullw
355 // CHECK: call i64 @_mm_mullo_pi16
356 
357 void __attribute__((noinline))
358 test_packs() {
359   res = _mm_packs_pu16((__m64)ull1, (__m64)ull2);
360   res = _mm_packs_pi16((__m64)ull1, (__m64)ull2);
361   res = _mm_packs_pi32((__m64)ull1, (__m64)ull2);
362 }
363 
364 // CHECK-LABEL: @test_packs
365 
366 // CHECK-LABEL: define available_externally i64 @_mm_packs_pu16
367 // CHECK: call <8 x i16> @vec_cmplt
368 // CHECK: call <16 x i8> @vec_packs(unsigned short vector[8], unsigned short vector[8])
369 // CHECK: call <16 x i8> @vec_pack(bool vector[8], bool vector[8])
370 // CHECK: call <16 x i8> @vec_sel(unsigned char vector[16], unsigned char vector[16], bool vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef zeroinitializer, <16 x i8> noundef %{{[0-9a-zA-Z_.]+}})
371 
372 // CHECK-LABEL: define available_externally i64 @_mm_packs_pi16
373 // CHECK: call <16 x i8> @vec_packs(short vector[8], short vector[8])
374 
375 // CHECK-LABEL: define available_externally i64 @_mm_packs_pi32
376 // CHECK: call <8 x i16> @vec_packs(int vector[4], int vector[4])
377 
378 void __attribute__((noinline))
379 test_alt_name_packs() {
380   res = _m_packssdw(m1, m2);
381   res = _m_packsswb(m1, m2);
382   res = _m_packuswb(m1, m2);
383 }
384 
385 // CHECK-LABEL: @test_alt_name_packs
386 
387 // CHECK-LABEL: define available_externally i64 @_m_packssdw
388 // CHECK: call i64 @_mm_packs_pi32
389 
390 // CHECK-LABEL: define available_externally i64 @_m_packsswb
391 // CHECK: call i64 @_mm_packs_pi16
392 
393 // CHECK-LABEL: define available_externally i64 @_m_packuswb
394 // CHECK: call i64 @_mm_packs_pu16
395 
396 void __attribute__((noinline))
397 test_set() {
398   m1 = _mm_set_pi32(2134, -128);
399   m1 = _mm_set_pi16(2134, -128, 1234, 6354);
400   m1 = _mm_set_pi8(-128, 10, 0, 123, -1, -5, 127, 5);
401 }
402 
403 // CHECK-LABEL: @test_set
404 
405 // CHECK-LABEL: define available_externally i64 @_mm_set_pi32
406 // CHECK-COUNT-2: store i32 %{{[0-9a-zA-Z_.]+}}, i32*
407 
408 // CHECK-LABEL: define available_externally i64 @_mm_set_pi16
409 // CHECK-COUNT-4: store i16 %{{[0-9a-zA-Z_.]+}}, i16*
410 
411 // CHECK-LABEL: define available_externally i64 @_mm_set_pi8
412 // CHECK-COUNT-8: store i8 %{{[0-9a-zA-Z_.]+}}, i8*
413 
414 void __attribute__((noinline))
415 test_set1() {
416   res = _mm_set1_pi32(i1);
417   res = _mm_set1_pi16(s[0]);
418   res = _mm_set1_pi8(c[0]);
419 }
420 
421 // CHECK-LABEL: @test_set1
422 
423 // CHECK-LABEL: define available_externally i64 @_mm_set1_pi32
424 // CHECK-COUNT-2: store i32 %{{[0-9a-zA-Z_.]+}}, i32*
425 
426 // CHECK-LABEL: define available_externally i64 @_mm_set1_pi16
427 // CHECK-P9: call <8 x i16> @vec_splats(short)
428 // CHECK-P9: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0
429 // CHECK-P8: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
430 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR1]], align 8
431 // CHECK-P8: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
432 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR2]], align 2
433 // CHECK-P8: %[[ADDR3:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2
434 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR3]], align 4
435 // CHECK-P8: %[[ADDR4:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3
436 // CHECK-P8: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR4]], align 2
437 
438 
439 // CHECK-LABEL: define available_externally i64 @_mm_set1_pi8
440 // CHECK: call <16 x i8> @vec_splats(signed char)
441 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast <16 x i8> %{{[0-9a-zA-Z_.]+}} to <2 x i64>
442 // CHECK: extractelement <2 x i64> %[[CAST]], i32 0
443 
444 void __attribute__((noinline))
445 test_setr() {
446   res = _mm_setr_pi32(i1, i2);
447   res = _mm_setr_pi16(s[0], s[1], s[2], s[3]);
448   res = _mm_setr_pi8(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
449 }
450 
451 // CHECK-LABEL: @test_setr
452 
453 // CHECK-LABEL: define available_externally i64 @_mm_setr_pi32
454 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
455 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR1]], align 8
456 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
457 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR2]], align 4
458 
459 // CHECK-LABEL: define available_externally i64 @_mm_setr_pi16
460 // CHECK: call i64 @_mm_set_pi16
461 
462 // CHECK-LABEL: define available_externally i64 @_mm_setr_pi8
463 // CHECK: call i64 @_mm_set_pi8
464 
465 void __attribute__((noinline))
466 test_setzero() {
467   res = _mm_setzero_si64();
468 }
469 
470 // CHECK-LABEL: @test_setzero
471 
472 // CHECK-LABEL: define available_externally i64 @_mm_setzero_si64
473 // CHECK: entry
474 // CHECK-NEXT: ret i64 0
475 
476 void __attribute__((noinline))
477 test_sll() {
478   res = _mm_sll_pi16(m1, m2);
479   res = _mm_sll_pi32(m1, m2);
480   res = _mm_sll_si64(m1, m2);
481   res = _mm_slli_pi16(m1, i1);
482   res = _mm_slli_pi32(m1, i1);
483   res = _mm_slli_si64(m1, i1);
484 }
485 
486 // CHECK-LABEL: @test_sll
487 
488 // CHECK-LABEL: define available_externally i64 @_mm_sll_pi16
489 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp ule i64 %{{[0-9a-zA-Z_.]+}}, 15
490 // CHECK-NEXT: br i1 %[[CMP]]
491 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
492 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i16
493 // CHECK: call <8 x i16> @vec_splats(unsigned short)
494 // CHECK: call <8 x i16> @vec_sl(short vector[8], unsigned short vector[8])
495 // CHECK: store i64 0, i64*
496 
497 // CHECK-LABEL: define available_externally i64 @_mm_sll_pi32
498 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
499 // CHECK: shl i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC]]
500 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
501 // CHECK: shl i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
502 
503 // CHECK-LABEL: define available_externally i64 @_mm_sll_si64
504 // CHECK: shl i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
505 
506 // CHECK-LABEL: define available_externally i64 @_mm_slli_pi16
507 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64
508 // CHECK: call i64 @_mm_sll_pi16(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]])
509 
510 // CHECK-LABEL: define available_externally i64 @_mm_slli_pi32
511 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64
512 // CHECK: call i64 @_mm_sll_pi32(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]])
513 
514 // CHECK-LABEL: define available_externally i64 @_mm_slli_si64
515 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64
516 // CHECK: shl i64 %{{[0-9a-zA-Z_.]+}}, %[[EXT]]
517 
518 void __attribute__((noinline))
519 test_alt_name_sll() {
520   res = _m_pslld(m1, m2);
521   res = _m_pslldi(m1, i1);
522   res = _m_psllq(m1, m2);
523   res = _m_psllqi(m1, i1);
524   res = _m_psllw(m1, m2);
525   res = _m_psllwi(m1, i1);
526 }
527 
528 // CHECK-LABEL: @test_alt_name_sll
529 
530 // CHECK-LABEL: define available_externally i64 @_m_pslld
531 // CHECK: call i64 @_mm_sll_pi32
532 
533 // CHECK-LABEL: define available_externally i64 @_m_pslldi
534 // CHECK: call i64 @_mm_slli_pi32
535 
536 // CHECK-LABEL: define available_externally i64 @_m_psllq
537 // CHECK: call i64 @_mm_sll_si64
538 
539 // CHECK-LABEL: define available_externally i64 @_m_psllqi
540 // CHECK: call i64 @_mm_slli_si64
541 
542 // CHECK-LABEL: define available_externally i64 @_m_psllw
543 // CHECK: call i64 @_mm_sll_pi16
544 
545 // CHECK-LABEL: define available_externally i64 @_m_psllwi
546 // CHECK: call i64 @_mm_slli_pi16
547 
548 void __attribute__((noinline))
549 test_sra() {
550   res = _mm_sra_pi32(m1, m2);
551   res = _mm_sra_pi16(m1, m2);
552   res = _mm_srai_pi32(m1, i1);
553   res = _mm_srai_pi16(m1, i1);
554 }
555 
556 // CHECK-LABEL: @test_sra
557 
558 // CHECK-LABEL: define available_externally i64 @_mm_sra_pi32
559 // CHECK: %[[TRUNC1:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
560 // CHECK: ashr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC1]]
561 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
562 // CHECK: ashr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC2]]
563 
564 // CHECK-LABEL: define available_externally i64 @_mm_sra_pi16
565 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp ule i64 %{{[0-9a-zA-Z_.]+}}, 15
566 // CHECK: br i1 %[[CMP]]
567 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
568 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i16
569 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %[[TRUNC]])
570 // CHECK: call <8 x i16> @vec_sra(short vector[8], unsigned short vector[8])
571 // CHECK: store i64 0, i64*
572 
573 // CHECK-LABEL: define available_externally i64 @_mm_srai_pi32
574 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64
575 // CHECK: call i64 @_mm_sra_pi32(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]])
576 
577 // CHECK-LABEL: define available_externally i64 @_mm_srai_pi16
578 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64
579 // CHECK: call i64 @_mm_sra_pi16(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]])
580 
581 void __attribute__((noinline))
582 test_alt_name_sra() {
583   res = _m_psrad(m1, m2);
584   res = _m_psraw(m1, m2);
585   res = _m_psradi(m1, i1);
586   res = _m_psrawi(m1, i1);
587 }
588 
589 // CHECK-LABEL: @test_alt_name_sra
590 
591 // CHECK-LABEL: define available_externally i64 @_m_psrad
592 // CHECK: call i64 @_mm_sra_pi32
593 
594 // CHECK-LABEL: define available_externally i64 @_m_psraw
595 // CHECK: call i64 @_mm_sra_pi16
596 
597 // CHECK-LABEL: define available_externally i64 @_m_psradi
598 // CHECK: call i64 @_mm_srai_pi32
599 
600 // CHECK-LABEL: define available_externally i64 @_m_psrawi
601 // CHECK: call i64 @_mm_srai_pi16
602 
603 void __attribute__((noinline))
604 test_srl() {
605   res = _mm_srl_si64(m1, m2);
606   res = _mm_srl_pi32(m1, m2);
607   res = _mm_srl_pi16(m1, m2);
608   res = _mm_srli_si64(m1, i1);
609   res = _mm_srli_pi32(m1, i1);
610   res = _mm_srli_pi16(m1, i1);
611 }
612 
613 // CHECK-LABEL: @test_srl
614 
615 // CHECK-LABEL: define available_externally i64 @_mm_srl_si64
616 // CHECK: lshr i64 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
617 
618 // CHECK-LABEL: define available_externally i64 @_mm_srl_pi32
619 // CHECK: %[[TRUNC1:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
620 // CHECK: lshr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC1]]
621 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
622 // CHECK: lshr i32 %{{[0-9a-zA-Z_.]+}}, %[[TRUNC2]]
623 
624 // CHECK-LABEL: define available_externally i64 @_mm_srl_pi16
625 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp ule i64 %{{[0-9a-zA-Z_.]+}}, 15
626 // CHECK: br i1 %[[CMP]]
627 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
628 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i16
629 // CHECK: call <8 x i16> @vec_splats(unsigned short)
630 // CHECK: call <8 x i16> @vec_sr(unsigned short vector[8], unsigned short vector[8])
631 // CHECK: store i64 0, i64* %{{[0-9a-zA-Z_.]+}}, align 8
632 
633 // CHECK-LABEL: define available_externally i64 @_mm_srli_si64
634 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64
635 // CHECK: lshr i64 %{{[0-9a-zA-Z_.]+}}, %[[EXT]]
636 
637 // CHECK-LABEL: define available_externally i64 @_mm_srli_pi32
638 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64
639 // CHECK: call i64 @_mm_srl_pi32(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]])
640 
641 // CHECK-LABEL: define available_externally i64 @_mm_srli_pi16
642 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64
643 // CHECK: call i64 @_mm_srl_pi16(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %[[EXT]])
644 
645 void __attribute__((noinline))
646 test_alt_name_srl() {
647   res = _m_psrlq(m1, m2);
648   res = _m_psrld(m1, m2);
649   res = _m_psrlw(m1, m2);
650   res = _m_psrlqi(m1, i1);
651   res = _m_psrldi(m1, i1);
652   res = _m_psrlwi(m1, i1);
653 }
654 
655 // CHECK-LABEL: @test_alt_name_srl
656 
657 // CHECK-LABEL: define available_externally i64 @_m_psrlq
658 // CHECK: call i64 @_mm_srl_si64
659 
660 // CHECK-LABEL: define available_externally i64 @_m_psrld
661 // CHECK: call i64 @_mm_srl_pi32
662 
663 // CHECK-LABEL: define available_externally i64 @_m_psrlw
664 // CHECK: call i64 @_mm_srl_pi16
665 
666 // CHECK-LABEL: define available_externally i64 @_m_psrlqi
667 // CHECK: call i64 @_mm_srli_si64
668 
669 // CHECK-LABEL: define available_externally i64 @_m_psrldi
670 // CHECK: call i64 @_mm_srli_pi32
671 
672 // CHECK-LABEL: define available_externally i64 @_m_psrlwi
673 // CHECK: call i64 @_mm_srli_pi16
674 
675 void __attribute__((noinline))
676 test_sub() {
677   res = _mm_sub_pi32(m1, m2);
678   res = _mm_sub_pi16(m1, m2);
679   res = _mm_sub_pi8(m1, m2);
680   res = _mm_subs_pi16(m1, m2);
681   res = _mm_subs_pi8(m1, m2);
682   res = _mm_subs_pu16(m1, m2);
683   res = _mm_subs_pu8(m1, m2);
684 }
685 
686 // CHECK-LABEL: @test_sub
687 
688 // CHECK-LABEL: define available_externally i64 @_mm_sub_pi32
689 // CHECK-P8-COUNT-2: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
690 // CHECK-P8: sub nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
691 // CHECK-P8-COUNT-2: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
692 // CHECK-P8: sub nsw i32 %{{[0-9a-zA-Z_.]+}}, %{{[0-9a-zA-Z_.]+}}
693 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
694 // CHECK-P9: call <2 x i64> @vec_splats(unsigned long long)
695 // CHECK-P9: call <4 x i32> @vec_sub(int vector[4], int vector[4])
696 
697 // CHECK-LABEL: define available_externally i64 @_mm_sub_pi16
698 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
699 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
700 // CHECK: call <8 x i16> @vec_sub(short vector[8], short vector[8])
701 
702 // CHECK-LABEL: define available_externally i64 @_mm_sub_pi8
703 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
704 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
705 // CHECK: call <16 x i8> @vec_sub(signed char vector[16], signed char vector[16])
706 
707 // CHECK-LABEL: define available_externally i64 @_mm_subs_pi16
708 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
709 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
710 // CHECK: call <8 x i16> @vec_subs(short vector[8], short vector[8])
711 
712 // CHECK-LABEL: define available_externally i64 @_mm_subs_pi8
713 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
714 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
715 // CHECK: call <16 x i8> @vec_subs(signed char vector[16], signed char vector[16])
716 
717 // CHECK-LABEL: define available_externally i64 @_mm_subs_pu16
718 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
719 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
720 // CHECK: call <8 x i16> @vec_subs(unsigned short vector[8], unsigned short vector[8])
721 
722 // CHECK-LABEL: define available_externally i64 @_mm_subs_pu8
723 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
724 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
725 // CHECK: call <16 x i8> @vec_subs(unsigned char vector[16], unsigned char vector[16])
726 
727 void __attribute__((noinline))
728 test_alt_name_sub() {
729   res = _m_psubd(m1, m2);
730   res = _m_psubw(m1, m2);
731   res = _m_psubb(m1, m2);
732   res = _m_psubsw(m1, m2);
733   res = _m_psubsb(m1, m2);
734   res = _m_psubusw(m1, m2);
735   res = _m_psubusb(m1, m2);
736 }
737 
738 // CHECK-LABEL: @test_alt_name_sub
739 
740 // CHECK-LABEL: define available_externally i64 @_m_psubd
741 // CHECK: call i64 @_mm_sub_pi32
742 
743 // CHECK-LABEL: define available_externally i64 @_m_psubw
744 // CHECK: call i64 @_mm_sub_pi16
745 
746 // CHECK-LABEL: define available_externally i64 @_m_psubb
747 // CHECK: call i64 @_mm_sub_pi8
748 
749 // CHECK-LABEL: define available_externally i64 @_m_psubsw
750 // CHECK: call i64 @_mm_subs_pi16
751 
752 // CHECK-LABEL: define available_externally i64 @_m_psubsb
753 // CHECK: call i64 @_mm_subs_pi8
754 
755 // CHECK-LABEL: define available_externally i64 @_m_psubusw
756 // CHECK: call i64 @_mm_subs_pu16
757 
758 // CHECK-LABEL: define available_externally i64 @_m_psubusb
759 // CHECK: call i64 @_mm_subs_pu8
760 
761 void __attribute__((noinline))
762 test_unpack() {
763   res = _mm_unpackhi_pi32(m1, m2);
764   res = _mm_unpackhi_pi16(m1, m2);
765   res = _mm_unpackhi_pi8(m1, m2);
766   res = _mm_unpacklo_pi32(m1, m2);
767   res = _mm_unpacklo_pi16(m1, m2);
768   res = _mm_unpacklo_pi8(m1, m2);
769 }
770 
771 // CHECK-LABEL: @test_unpack
772 
773 // CHECK-LABEL: define available_externally i64 @_mm_unpackhi_pi32
774 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
775 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
776 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR1]], align 8
777 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
778 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
779 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR2]], align 4
780 
781 // CHECK-LABEL: define available_externally i64 @_mm_unpackhi_pi16
782 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2
783 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
784 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR1]], align 8
785 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2
786 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
787 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR2]], align 2
788 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3
789 // CHECK: %[[ADDR3:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2
790 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR3]], align 4
791 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3
792 // CHECK: %[[ADDR4:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3
793 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR4]], align 2
794 
795 // CHECK-LABEL: define available_externally i64 @_mm_unpackhi_pi8
796 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
797 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
798 // CHECK: call <16 x i8> @vec_mergel(unsigned char vector[16], unsigned char vector[16])
799 
800 // CHECK-LABEL: define available_externally i64 @_mm_unpacklo_pi32
801 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
802 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
803 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR1]], align 8
804 // CHECK: getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
805 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
806 // CHECK: store i32 %{{[0-9a-zA-Z_.]+}}, i32* %[[ADDR2]], align 4
807 
808 // CHECK-LABEL: define available_externally i64 @_mm_unpacklo_pi16
809 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
810 // CHECK: %[[ADDR1:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
811 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR1]], align 8
812 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 0
813 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
814 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR2]], align 2
815 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
816 // CHECK: %[[ADDR3:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 2
817 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR3]], align 4
818 // CHECK: getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 1
819 // CHECK: %[[ADDR4:[0-9a-zA-Z_.]+]] = getelementptr inbounds [4 x i16], [4 x i16]* %{{[0-9a-zA-Z_.]+}}, i64 0, i64 3
820 // CHECK: store i16 %{{[0-9a-zA-Z_.]+}}, i16* %[[ADDR4]], align 2
821 
822 // CHECK-LABEL: define available_externally i64 @_mm_unpacklo_pi8
823 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
824 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
825 // CHECK: call <16 x i8> @vec_mergel(unsigned char vector[16], unsigned char vector[16])
826 
827 void __attribute__((noinline))
828 test_alt_name_unpack() {
829   res = _m_punpckhdq(m1, m2);
830   res = _m_punpckhwd(m1, m2);
831   res = _m_punpckhbw(m1, m2);
832   res = _m_punpckldq(m1, m2);
833   res = _m_punpcklwd(m1, m2);
834   res = _m_punpcklbw(m1, m2);
835 }
836 
837 // CHECK-LABEL: @test_alt_name_unpack
838 
839 // CHECK-LABEL: define available_externally i64 @_m_punpckhdq
840 // CHECK: call i64 @_mm_unpackhi_pi32
841 
842 // CHECK-LABEL: define available_externally i64 @_m_punpckhwd
843 // CHECK: call i64 @_mm_unpackhi_pi16
844 
845 // CHECK-LABEL: define available_externally i64 @_m_punpckhbw
846 // CHECK: call i64 @_mm_unpackhi_pi8
847 
848 // CHECK-LABEL: define available_externally i64 @_m_punpckldq
849 // CHECK: call i64 @_mm_unpacklo_pi32
850 
851 // CHECK-LABEL: define available_externally i64 @_m_punpcklwd
852 // CHECK: call i64 @_mm_unpacklo_pi16
853 
854 // CHECK-LABEL: define available_externally i64 @_m_punpcklbw
855 // CHECK: call i64 @_mm_unpacklo_pi8
856