1 // REQUIRES: powerpc-registered-target
2 
3 // RUN: %clang -S -emit-llvm -target powerpc64-unknown-linux-gnu -mcpu=pwr8 -ffreestanding -DNO_WARN_X86_INTRINSICS %s \
4 // RUN:  -ffp-contract=off -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK,CHECK-BE
5 // RUN: %clang -S -emit-llvm -target powerpc64le-unknown-linux-gnu -mcpu=pwr8 -ffreestanding -DNO_WARN_X86_INTRINSICS %s \
6 // RUN:   -ffp-contract=off -fno-discard-value-names -mllvm -disable-llvm-optzns -o - | llvm-cxxfilt -n | FileCheck %s --check-prefixes=CHECK,CHECK-LE
7 
8 // CHECK-BE-DAG: @_mm_movemask_pd.perm_mask = internal constant <4 x i32> <i32 -2139062144, i32 -2139062144, i32 -2139062144, i32 -2139078656>, align 16
9 // CHECK-BE-DAG: @_mm_shuffle_epi32.permute_selectors = internal constant [4 x i32] [i32 66051, i32 67438087, i32 134810123, i32 202182159], align 4
10 // CHECK-BE-DAG: @_mm_shufflehi_epi16.permute_selectors = internal constant [4 x i16] [i16 2057, i16 2571, i16 3085, i16 3599], align 2
11 // CHECK-BE-DAG: @_mm_shufflelo_epi16.permute_selectors = internal constant [4 x i16] [i16 1, i16 515, i16 1029, i16 1543], align 2
12 
13 // CHECK-LE-DAG: @_mm_movemask_pd.perm_mask = internal constant <4 x i32> <i32 -2139094976, i32 -2139062144, i32 -2139062144, i32 -2139062144>, align 16
14 // CHECK-LE-DAG: @_mm_shuffle_epi32.permute_selectors = internal constant [4 x i32] [i32 50462976, i32 117835012, i32 185207048, i32 252579084], align 4
15 // CHECK-LE-DAG: @_mm_shufflehi_epi16.permute_selectors = internal constant [4 x i16] [i16 2312, i16 2826, i16 3340, i16 3854], align 2
16 // CHECK-LE-DAG: @_mm_shufflelo_epi16.permute_selectors = internal constant [4 x i16] [i16 256, i16 770, i16 1284, i16 1798], align 2
17 
18 #include <emmintrin.h>
19 
20 __m128i resi, mi1, mi2;
21 __m128i *mip;
22 double dp[2];
23 __m128d resd, md1, md2;
24 __m64 res64, m641, m642;
25 __m128 res, m1;
26 int i;
27 char chs[16];
28 int is[4];
29 short ss[8];
30 long long i64s[2];
31 
32 void __attribute__((noinline))
33 test_add() {
34   resi = _mm_add_epi64(mi1, mi2);
35   resi = _mm_add_epi32(mi1, mi2);
36   resi = _mm_add_epi16(mi1, mi2);
37   resi = _mm_add_epi8(mi1, mi2);
38   resd = _mm_add_pd(md1, md2);
39   resd = _mm_add_sd(md1, md2);
40   res64 = _mm_add_si64(m641, m642);
41   resi = _mm_adds_epi16(mi1, mi2);
42   resi = _mm_adds_epi8(mi1, mi2);
43   resi = _mm_adds_epu16(mi1, mi2);
44   resi = _mm_adds_epu8(mi1, mi2);
45 }
46 
47 // CHECK-LABEL: @test_add
48 
49 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi64
50 // CHECK: add <2 x i64>
51 
52 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi32
53 // CHECK: add <4 x i32>
54 
55 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi16
56 // CHECK: add <8 x i16>
57 
58 // CHECK-LABEL: define available_externally <2 x i64> @_mm_add_epi8
59 // CHECK: add <16 x i8>
60 
61 // CHECK-LABEL: define available_externally <2 x double> @_mm_add_pd
62 // CHECK: fadd <2 x double>
63 
64 // CHECK-LABEL: define available_externally <2 x double> @_mm_add_sd
65 // CHECK: fadd double
66 
67 // CHECK-LABEL: define available_externally i64 @_mm_add_si64
68 // CHECK: add i64
69 
70 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epi16
71 // CHECK: call <8 x i16> @vec_adds(short vector[8], short vector[8])
72 
73 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epi8
74 // CHECK: call <16 x i8> @vec_adds(signed char vector[16], signed char vector[16])
75 
76 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epu16
77 // CHECK: call <8 x i16> @vec_adds(unsigned short vector[8], unsigned short vector[8])
78 
79 // CHECK-LABEL: define available_externally <2 x i64> @_mm_adds_epu8
80 // CHECK: call <16 x i8> @vec_adds(unsigned char vector[16], unsigned char vector[16])
81 
82 void __attribute__((noinline))
83 test_avg() {
84   resi = _mm_avg_epu16(mi1, mi2);
85   resi = _mm_avg_epu8(mi1, mi2);
86 }
87 
88 // CHECK-LABEL: @test_avg
89 
90 // CHECK-LABEL: define available_externally <2 x i64> @_mm_avg_epu16
91 // CHECK: call <8 x i16> @vec_avg(unsigned short vector[8], unsigned short vector[8])
92 
93 // CHECK-LABEL: define available_externally <2 x i64> @_mm_avg_epu8
94 // CHECK: call <16 x i8> @vec_avg(unsigned char vector[16], unsigned char vector[16])
95 
96 void __attribute__((noinline))
97 test_bs() {
98   resi = _mm_bslli_si128(mi1, i);
99   resi = _mm_bsrli_si128(mi1, i);
100 }
101 
102 // CHECK-LABEL: @test_bs
103 
104 // CHECK-LABEL: define available_externally <2 x i64> @_mm_bslli_si128
105 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
106 // CHECK: br i1 %[[CMP]]
107 // CHECK: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef zeroinitializer, i32 noundef zeroext %{{[0-9a-zA-Z_.]+}})
108 // CHECK: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
109 
110 // CHECK-LABEL: define available_externally <2 x i64> @_mm_bsrli_si128
111 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
112 // CHECK: br i1 %[[CMP]]
113 // CHECK-LE: call i1 @llvm.is.constant
114 // CHECK-LE: %[[SUB:[0-9a-zA-Z_.]+]] = sub nsw i32 16, %{{[0-9a-zA-Z_.]+}}
115 // CHECK-LE: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef zeroinitializer, <16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext %[[SUB]])
116 // CHECK-LE: %[[MUL:[0-9a-zA-Z_.]+]] = mul nsw i32 %{{[0-9a-zA-Z_.]+}}, 8
117 // CHECK-LE: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %[[MUL]] to i8
118 // CHECK-LE: call <16 x i8> @vec_splats(unsigned char)(i8 noundef zeroext %[[TRUNC]])
119 // CHECK-LE: call <16 x i8> @vec_sro(unsigned char vector[16], unsigned char vector[16])
120 // CHECK-LE: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
121 // CHECK-BE: %[[MUL:[0-9a-zA-Z_.]+]] = mul nsw i32 %{{[0-9a-zA-Z_.]+}}, 8
122 // CHECK-BE: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %[[MUL]] to i8
123 // CHECK-BE: call <16 x i8> @vec_splats(unsigned char)(i8 noundef zeroext %[[TRUNC]])
124 // CHECK-BE: call <16 x i8> @vec_slo(unsigned char vector[16], unsigned char vector[16])
125 // CHECK-BE: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
126 
127 void __attribute__((noinline))
128 test_cast() {
129   res = _mm_castpd_ps(md1);
130   resi = _mm_castpd_si128(md1);
131   resd = _mm_castps_pd(m1);
132   resi = _mm_castps_si128(m1);
133   resd = _mm_castsi128_pd(mi1);
134   res = _mm_castsi128_ps(mi1);
135 }
136 
137 // CHECK-LABEL: @test_cast
138 
139 // CHECK-LABEL: define available_externally <4 x float> @_mm_castpd_ps
140 // CHECK: bitcast <2 x double> %{{[0-9a-zA-Z_.]+}} to <4 x float>
141 
142 // CHECK-LABEL: define available_externally <2 x i64> @_mm_castpd_si128
143 // CHECK: bitcast <2 x double> %{{[0-9a-zA-Z_.]+}} to <2 x i64>
144 
145 // CHECK-LABEL: define available_externally <2 x double> @_mm_castps_pd
146 // CHECK: bitcast <4 x float> %{{[0-9a-zA-Z_.]+}} to <2 x double>
147 
148 // CHECK-LABEL: define available_externally <2 x i64> @_mm_castps_si128
149 // CHECK: bitcast <4 x float> %{{[0-9a-zA-Z_.]+}} to <2 x i64>
150 
151 // CHECK-LABEL: define available_externally <2 x double> @_mm_castsi128_pd
152 // CHECK: bitcast <2 x i64> %{{[0-9a-zA-Z_.]+}} to <2 x double>
153 
154 // CHECK-LABEL: define available_externally <4 x float> @_mm_castsi128_ps
155 // CHECK: bitcast <2 x i64> %{{[0-9a-zA-Z_.]+}} to <4 x float>
156 
157 void __attribute__((noinline))
158 test_cmp() {
159   resi = _mm_cmpeq_epi32(mi1, mi2);
160   resi = _mm_cmpeq_epi16(mi1, mi2);
161   resi = _mm_cmpeq_epi8(mi1, mi2);
162   resi = _mm_cmpgt_epi32(mi1, mi2);
163   resi = _mm_cmpgt_epi16(mi1, mi2);
164   resi = _mm_cmpgt_epi8(mi1, mi2);
165   resi = _mm_cmplt_epi32(mi1, mi2);
166   resi = _mm_cmplt_epi16(mi1, mi2);
167   resi = _mm_cmplt_epi8(mi1, mi2);
168   resd = _mm_cmpeq_pd(md1, md2);
169   resd = _mm_cmpeq_sd(md1, md2);
170   resd = _mm_cmpge_pd(md1, md2);
171   resd = _mm_cmpge_sd(md1, md2);
172   resd = _mm_cmpgt_pd(md1, md2);
173   resd = _mm_cmpgt_sd(md1, md2);
174   resd = _mm_cmple_pd(md1, md2);
175   resd = _mm_cmple_sd(md1, md2);
176   resd = _mm_cmplt_pd(md1, md2);
177   resd = _mm_cmplt_sd(md1, md2);
178   resd = _mm_cmpneq_pd(md1, md2);
179   resd = _mm_cmpneq_sd(md1, md2);
180   resd = _mm_cmpnge_pd(md1, md2);
181   resd = _mm_cmpnge_sd(md1, md2);
182   resd = _mm_cmpngt_pd(md1, md2);
183   resd = _mm_cmpngt_sd(md1, md2);
184   resd = _mm_cmpnle_pd(md1, md2);
185   resd = _mm_cmpnle_sd(md1, md2);
186   resd = _mm_cmpnlt_pd(md1, md2);
187   resd = _mm_cmpnlt_sd(md1, md2);
188   resd = _mm_cmpord_pd(md1, md2);
189   resd = _mm_cmpord_sd(md1, md2);
190   resd = _mm_cmpunord_pd(md1, md2);
191   resd = _mm_cmpunord_sd(md1, md2);
192 }
193 
194 // CHECK-LABEL: @test_cmp
195 
196 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpeq_epi32
197 // CHECK: call <4 x i32> @vec_cmpeq(int vector[4], int vector[4])
198 
199 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpeq_epi16
200 // CHECK: call <8 x i16> @vec_cmpeq(short vector[8], short vector[8])
201 
202 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpeq_epi8
203 // CHECK: call <16 x i8> @vec_cmpeq(signed char vector[16], signed char vector[16])
204 
205 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpgt_epi32
206 // CHECK: call <4 x i32> @vec_cmpgt(int vector[4], int vector[4])
207 
208 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpgt_epi16
209 // CHECK: call <8 x i16> @vec_cmpgt(short vector[8], short vector[8])
210 
211 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmpgt_epi8
212 // CHECK: call <16 x i8> @vec_cmpgt(signed char vector[16], signed char vector[16])
213 
214 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmplt_epi32
215 // CHECK: call <4 x i32> @vec_cmplt(int vector[4], int vector[4])
216 
217 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmplt_epi16
218 // CHECK: call <8 x i16> @vec_cmplt(short vector[8], short vector[8])
219 
220 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cmplt_epi8
221 // CHECK: call <16 x i8> @vec_cmplt(signed char vector[16], signed char vector[16])
222 
223 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpeq_pd
224 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
225 
226 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpeq_sd
227 // CHECK: call <2 x double> @vec_splats(double)
228 // CHECK: call <2 x double> @vec_splats(double)
229 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
230 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
231 
232 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpge_pd
233 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2])
234 
235 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpge_sd
236 // CHECK: call <2 x double> @vec_splats(double)
237 // CHECK: call <2 x double> @vec_splats(double)
238 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2])
239 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
240 
241 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpgt_pd
242 // CHECK: call <2 x i64> @vec_cmpgt(double vector[2], double vector[2])
243 
244 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpgt_sd
245 // CHECK: call <2 x double> @vec_splats(double)
246 // CHECK: call <2 x double> @vec_splats(double)
247 // CHECK: call <2 x i64> @vec_cmpgt(double vector[2], double vector[2])
248 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
249 
250 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmple_pd
251 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2])
252 
253 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmple_sd
254 // CHECK: call <2 x double> @vec_splats(double)
255 // CHECK: call <2 x double> @vec_splats(double)
256 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2])
257 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
258 
259 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmplt_pd
260 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2])
261 
262 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmplt_sd
263 // CHECK: call <2 x double> @vec_splats(double)
264 // CHECK: call <2 x double> @vec_splats(double)
265 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2])
266 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
267 
268 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpneq_pd
269 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
270 // CHECK: call <2 x double> @vec_nor(double vector[2], double vector[2])
271 
272 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpneq_sd
273 // CHECK: call <2 x double> @vec_splats(double)
274 // CHECK: call <2 x double> @vec_splats(double)
275 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
276 // CHECK: call <2 x double> @vec_nor(double vector[2], double vector[2])
277 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
278 
279 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnge_pd
280 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2])
281 
282 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnge_sd
283 // CHECK: call <2 x double> @vec_splats(double)
284 // CHECK: call <2 x double> @vec_splats(double)
285 // CHECK: call <2 x i64> @vec_cmplt(double vector[2], double vector[2])
286 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
287 
288 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpngt_pd
289 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2])
290 
291 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpngt_sd
292 // CHECK: call <2 x double> @vec_splats(double)
293 // CHECK: call <2 x double> @vec_splats(double)
294 // CHECK: call <2 x i64> @vec_cmple(double vector[2], double vector[2])
295 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
296 
297 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnle_pd
298 // CHECK: call <2 x i64> @vec_cmpgt(double vector[2], double vector[2])
299 
300 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnle_sd
301 // CHECK: call <2 x double> @vec_splats(double)
302 // CHECK: call <2 x double> @vec_splats(double)
303 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2])
304 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
305 
306 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnlt_pd
307 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2])
308 
309 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpnlt_sd
310 // CHECK: call <2 x double> @vec_splats(double)
311 // CHECK: call <2 x double> @vec_splats(double)
312 // CHECK: call <2 x i64> @vec_cmpge(double vector[2], double vector[2])
313 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
314 
315 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpord_pd
316 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
317 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
318 // CHECK: call <2 x i64> @vec_and(unsigned long long vector[2], unsigned long long vector[2])
319 
320 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpord_sd
321 // CHECK: call <2 x double> @vec_splats(double)
322 // CHECK: call <2 x double> @vec_splats(double)
323 // CHECK: call <2 x double> @_mm_cmpord_pd(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, <2 x double> noundef %{{[0-9a-zA-Z_.]+}})
324 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
325 
326 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpunord_pd
327 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
328 // CHECK: call <2 x i64> @vec_cmpeq(double vector[2], double vector[2])
329 // CHECK: call <2 x i64> @vec_nor(unsigned long long vector[2], unsigned long long vector[2])
330 // CHECK: call <2 x i64> @vec_orc(unsigned long long vector[2], unsigned long long vector[2])
331 
332 // CHECK-LABEL: define available_externally <2 x double> @_mm_cmpunord_sd
333 // CHECK: call <2 x double> @vec_splats(double)
334 // CHECK: call <2 x double> @vec_splats(double)
335 // CHECK: call <2 x double> @_mm_cmpunord_pd(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, <2 x double> noundef %{{[0-9a-zA-Z_.]+}})
336 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
337 
338 void __attribute__((noinline))
339 test_comi() {
340   i = _mm_comieq_sd(md1, md2);
341   i = _mm_comige_sd(md1, md2);
342   i = _mm_comigt_sd(md1, md2);
343   i = _mm_comile_sd(md1, md2);
344   i = _mm_comilt_sd(md1, md2);
345   i = _mm_comineq_sd(md1, md2);
346 }
347 
348 // CHECK-LABEL: @test_comi
349 
350 // CHECK-LABEL: define available_externally signext i32 @_mm_comieq_sd
351 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp oeq double
352 // CHECK: zext i1 %[[CMP]] to i32
353 
354 // CHECK-LABEL: define available_externally signext i32 @_mm_comige_sd
355 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp oge double
356 // CHECK: zext i1 %[[CMP]] to i32
357 
358 // CHECK-LABEL: define available_externally signext i32 @_mm_comigt_sd
359 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp ogt double
360 // CHECK: zext i1 %[[CMP]] to i32
361 
362 // CHECK-LABEL: define available_externally signext i32 @_mm_comile_sd
363 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp ole double
364 // CHECK: zext i1 %[[CMP]] to i32
365 
366 // CHECK-LABEL: define available_externally signext i32 @_mm_comilt_sd
367 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp olt double
368 // CHECK: zext i1 %[[CMP]] to i32
369 
370 // CHECK-LABEL: define available_externally signext i32 @_mm_comineq_sd
371 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = fcmp une double
372 // CHECK: zext i1 %[[CMP]] to i32
373 
374 void __attribute__((noinline))
375 test_control() {
376   _mm_clflush(dp);
377   _mm_lfence();
378   _mm_mfence();
379   _mm_pause();
380 }
381 
382 // CHECK-LABEL: @test_control
383 
384 // CHECK-LABEL: define available_externally void @_mm_clflush
385 // CHECK: call void asm sideeffect "dcbf 0,$0", "b,~{memory}"(i8* %{{[0-9a-zA-Z_.]+}})
386 
387 // CHECK-LABEL: define available_externally void @_mm_lfence()
388 // CHECK: fence release
389 
390 // CHECK-LABEL: define available_externally void @_mm_mfence()
391 // CHECK: fence seq_cst
392 
393 // CHECK-LABEL: define available_externally void @_mm_pause()
394 // CHECK: call i64 asm sideeffect "\09mfppr\09$0;   or 31,31,31;   isync;   lwsync;   isync;   mtppr\09$0;", "=r,~{memory}"()
395 
396 void __attribute__((noinline))
397 test_converts() {
398   resd = _mm_cvtepi32_pd(mi1);
399   res = _mm_cvtepi32_ps(mi1);
400   resi = _mm_cvtpd_epi32(md1);
401   res64 = _mm_cvtpd_pi32(md1);
402   res = _mm_cvtpd_ps(md1);
403   resd = _mm_cvtpi32_pd(res64);
404   resi = _mm_cvtps_epi32(m1);
405   resd = _mm_cvtps_pd(m1);
406   *dp = _mm_cvtsd_f64(md1);
407   i = _mm_cvtsd_si32(md1);
408   i64s[0] = _mm_cvtsd_si64(md1);
409   i64s[0] = _mm_cvtsd_si64x(md1);
410   res = _mm_cvtsd_ss(m1, md2);
411   i = _mm_cvtsi128_si32(mi1);
412   i64s[0] = _mm_cvtsi128_si64(mi1);
413   i64s[0] = _mm_cvtsi128_si64x(mi1);
414   resd = _mm_cvtsi32_sd(md1, i);
415   resi = _mm_cvtsi32_si128(i);
416   resd = _mm_cvtsi64_sd(md1, i64s[1]);
417   resi = _mm_cvtsi64_si128(i64s[1]);
418   resd = _mm_cvtsi64x_sd(md1, i64s[1]);
419   resi = _mm_cvtsi64x_si128(i64s[1]);
420   resd = _mm_cvtss_sd(md1, m1);
421   resi = _mm_cvttpd_epi32(md1);
422   res64 = _mm_cvttpd_pi32(md1);
423   resi = _mm_cvttps_epi32(m1);
424   i = _mm_cvttsd_si32(md1);
425   i64s[0] = _mm_cvttsd_si64(md1);
426   i64s[0] = _mm_cvttsd_si64x(md1);
427 }
428 
429 // CHECK-LABEL: @test_converts
430 
431 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtepi32_pd
432 // CHECK: call <2 x i64> @vec_unpackh(int vector[4])
433 // CHECK: %[[CONV:[0-9a-zA-Z_.]+]] = sitofp <2 x i64> %{{[0-9a-zA-Z_.]+}} to <2 x double>
434 // CHECK: fmul <2 x double> %[[CONV]], <double 1.000000e+00, double 1.000000e+00>
435 
436 // CHECK-LABEL: define available_externally <4 x float> @_mm_cvtepi32_ps
437 // CHECK: call <4 x float> @llvm.ppc.altivec.vcfsx(<4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 0)
438 
439 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtpd_epi32
440 // CHECK: call <2 x double> @vec_rint(double vector[2])
441 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16
442 // CHECK: call <4 x i32> asm "xvcvdpsxws ${0:x},${1:x}", "=^wa,^wa"(<2 x double> %{{[0-9a-zA-Z_.]+}})
443 // CHECK: call <4 x i32> @vec_mergeo(int vector[4], int vector[4])
444 // CHECK: call <4 x i32> @vec_vpkudum(long long vector[2], long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef zeroinitializer)
445 
446 // CHECK-LABEL: define available_externally i64 @_mm_cvtpd_pi32
447 // CHECK: call <2 x i64> @_mm_cvtpd_epi32(<2 x double> noundef %{{[0-9a-zA-Z_.]+}})
448 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0
449 
450 // CHECK-LABEL: define available_externally <4 x float> @_mm_cvtpd_ps
451 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16
452 // CHECK: call <4 x i32> asm "xvcvdpsp ${0:x},${1:x}", "=^wa,^wa"(<2 x double> %{{[0-9a-zA-Z_.]+}})
453 // CHECK: call <4 x i32> @vec_mergeo(int vector[4], int vector[4])
454 // CHECK: call <4 x i32> @vec_vpkudum(long long vector[2], long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef zeroinitializer)
455 
456 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtpi32_pd
457 // CHECK: call <2 x i64> @vec_splats(unsigned long long)
458 // CHECK: call <2 x i64> @vec_unpackl(int vector[4])
459 // CHECK: %[[CONV:[0-9a-zA-Z_.]+]] = sitofp <2 x i64> %{{[0-9a-zA-Z._]+}} to <2 x double>
460 // CHECK: fmul <2 x double> %[[CONV]], <double 1.000000e+00, double 1.000000e+00>
461 
462 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtps_epi32
463 // CHECK: call <4 x float> @vec_rint(float vector[4])
464 // CHECK: call <4 x i32> @llvm.ppc.altivec.vctsxs(<4 x float> %{{[0-9a-zA-Z_.]+}}, i32 0)
465 
466 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtps_pd
467 // CHECK-BE: call <4 x float> @vec_vmrghw(float vector[4], float vector[4])
468 // CHECK-BE: call <2 x double> asm " xvcvspdp ${0:x},${1:x}", "=^wa,^wa"(<4 x float> %{{[0-9a-zA-Z_.]+}})
469 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
470 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
471 // CHECK-LE: call <2 x double> asm " xvcvspdp ${0:x},${1:x}", "=^wa,^wa"(<4 x float> %{{[0-9a-zA-Z_.]+}})
472 
473 // CHECK-LABEL: define available_externally double @_mm_cvtsd_f64
474 // CHECK: extractelement <2 x double> %{{[0-9a-zA-Z_.]+}}, i32 0
475 
476 // CHECK-LABEL: define available_externally signext i32 @_mm_cvtsd_si32
477 // CHECK: call <2 x double> @vec_rint(double vector[2])
478 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i32
479 
480 // CHECK-LABEL: define available_externally i64 @_mm_cvtsd_si64
481 // CHECK: call <2 x double> @vec_rint(double vector[2])
482 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i64
483 
484 // CHECK-LABEL: define available_externally i64 @_mm_cvtsd_si64x
485 // CHECK: call i64 @_mm_cvtsd_si64(<2 x double> noundef %{{[0-9a-zA-Z_.]+}})
486 
487 // CHECK-LABEL: define available_externally <4 x float> @_mm_cvtsd_ss
488 // CHECK-BE: %[[EXT:[0-9a-zA-Z_.]+]] = extractelement <2 x double> %{{[0-9a-zA-Z_.]+}}, i32 0
489 // CHECK-BE: %[[TRUNC:[0-9a-zA-Z_.]+]] = fptrunc double %[[EXT]] to float
490 // CHECK-BE: insertelement <4 x float> %{{[0-9a-zA-Z_.]+}}, float %[[TRUNC]], i32 0
491 // CHECK-LE: call <2 x double> @vec_splat(double vector[2], unsigned int)(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
492 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
493 // CHECK-LE: call <4 x float> asm "xscvdpsp ${0:x},${1:x}", "=^wa,^wa"(<2 x double> %{{[0-9a-zA-Z_.]+}})
494 // CHECK-LE: shufflevector <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> %{{[0-9a-zA-Z_.]+}}, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
495 
496 // CHECK-LABEL: define available_externally signext i32 @_mm_cvtsi128_si32
497 // CHECK: extractelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 0
498 
499 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi128_si64
500 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0
501 
502 // CHECK-LABEL: define available_externally i64 @_mm_cvtsi128_si64x
503 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0
504 
505 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtsi32_sd
506 // CHECK: sitofp i32 %{{[0-9a-zA-Z_.]+}} to double
507 
508 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtsi32_si128
509 // CHECK: call <2 x i64> @_mm_set_epi32(i32 noundef signext 0, i32 noundef signext 0, i32 noundef signext 0, i32 noundef signext %{{[0-9a-zA-Z_.]+}})
510 
511 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtsi64_sd
512 // CHECK: sitofp i64 %{{[0-9a-zA-Z_.]+}} to double
513 
514 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtsi64_si128
515 // CHECK: %[[INS:[0-9a-zA-Z_.]+]] = insertelement <2 x i64> undef, i64 %{{[0-9a-zA-Z_.]+}}, i32 0
516 // CHECK: insertelement <2 x i64> %[[INS]], i64 0, i32 1
517 
518 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtsi64x_sd
519 // CHECK: call <2 x double> @_mm_cvtsi64_sd(<2 x double> noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %{{[0-9a-zA-Z_.]+}})
520 
521 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvtsi64x_si128
522 // CHECK: %[[INS:[0-9a-zA-Z_.]+]] = insertelement <2 x i64> undef, i64 %{{[0-9a-zA-Z_.]+}}, i32 0
523 // CHECK: insertelement <2 x i64> %[[INS]], i64 0, i32 1
524 
525 // CHECK-LABEL: define available_externally <2 x double> @_mm_cvtss_sd
526 // CHECK-BE: fpext float %{{[0-9a-zA-Z_.]+}} to double
527 // CHECK-LE: call <4 x float> @vec_splat(float vector[4], unsigned int)(<4 x float> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
528 // CHECK-LE: call <2 x double> asm "xscvspdp ${0:x},${1:x}", "=^wa,^wa"(<4 x float> %{{[0-9a-zA-Z_.]+}})
529 // CHECK-LE: call <2 x double> @vec_mergel(double vector[2], double vector[2])
530 
531 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvttpd_epi32
532 // CHECK: call <4 x i32> asm "xvcvdpsxws ${0:x},${1:x}", "=^wa,^wa"
533 // CHECK: call <4 x i32> @vec_mergeo(int vector[4], int vector[4])
534 // CHECK: call <4 x i32> @vec_vpkudum(long long vector[2], long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef zeroinitializer)
535 
536 // CHECK-LABEL: define available_externally i64 @_mm_cvttpd_pi32
537 // CHECK: call <2 x i64> @_mm_cvttpd_epi32(<2 x double> noundef %{{[0-9a-zA-Z_.]+}})
538 
539 // CHECK-LABEL: define available_externally <2 x i64> @_mm_cvttps_epi32
540 // CHECK: call <4 x i32> @llvm.ppc.altivec.vctsxs(<4 x float> %{{[0-9a-zA-Z_.]+}}, i32 0)
541 
542 // CHECK-LABEL: define available_externally signext i32 @_mm_cvttsd_si32
543 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i32
544 
545 // CHECK-LABEL: define available_externally i64 @_mm_cvttsd_si64
546 // CHECK: fptosi double %{{[0-9a-zA-Z_.]+}} to i64
547 
548 // CHECK-LABEL: define available_externally i64 @_mm_cvttsd_si64x
549 // CHECK: call i64 @_mm_cvttsd_si64(<2 x double> noundef %{{[0-9a-zA-Z_.]+}})
550 
551 void __attribute__((noinline))
552 test_div() {
553   resd = _mm_div_pd(md1, md2);
554   resd = _mm_div_sd(md1, md2);
555 }
556 
557 // CHECK-LABEL: @test_div
558 
559 // CHECK-LABEL: define available_externally <2 x double> @_mm_div_pd
560 // CHECK: fdiv <2 x double>
561 
562 // CHECK-LABEL: define available_externally <2 x double> @_mm_div_sd
563 // CHECK: fdiv double
564 
565 void __attribute__((noinline))
566 test_extract() {
567   i = _mm_extract_epi16(mi1, i);
568 }
569 
570 // CHECK-LABEL: @test_extract
571 
572 // CHECK-LABEL: define available_externally signext i32 @_mm_extract_epi16
573 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 %{{[0-9a-zA-Z_.]+}}, 7
574 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = extractelement <8 x i16> %{{[0-9a-zA-Z_.]+}}, i32 %[[AND]]
575 // CHECK: zext i16 %[[EXT]] to i32
576 
577 void __attribute__((noinline))
578 test_insert() {
579   resi = _mm_insert_epi16 (mi1, i, is[0]);
580 }
581 
582 // CHECK-LABEL: @test_insert
583 
584 // CHECK-LABEL: define available_externally <2 x i64> @_mm_insert_epi16
585 // CHECK: trunc i32 %{{[0-9a-zA-Z_.]+}} to i16
586 // CHECK: and i32 %{{[0-9a-zA-Z_.]+}}, 7
587 
588 void __attribute__((noinline))
589 test_load() {
590   resd = _mm_load_pd(dp);
591   resd = _mm_load_pd1(dp);
592   resd = _mm_load_sd(dp);
593   resi = _mm_load_si128(mip);
594   resd = _mm_load1_pd(dp);
595   resd = _mm_loadh_pd(md1, dp);
596   resi = _mm_loadl_epi64(mip);
597   resd = _mm_loadl_pd(md1, dp);
598   resd = _mm_loadr_pd(dp);
599   resd = _mm_loadu_pd(dp);
600   resi = _mm_loadu_si128(mip);
601 }
602 
603 // CHECK-LABEL: @test_load
604 
605 // CHECK-LABEL: define available_externally <2 x double> @_mm_load_pd
606 // CHECK: call <16 x i8> @vec_ld(long, unsigned char vector[16] const*)(i64 noundef 0, <16 x i8>* noundef %{{[0-9a-zA-Z_.]+}})
607 
608 // CHECK-LABEL: define available_externally <2 x double> @_mm_load_pd1
609 // CHECK: call <2 x double> @_mm_load1_pd(double* noundef %{{[0-9a-zA-Z_.]+}})
610 
611 // CHECK-LABEL: define available_externally <2 x double> @_mm_load_sd
612 // CHECK: call <2 x double> @_mm_set_sd(double noundef %{{[0-9a-zA-Z_.]+}})
613 
614 // CHECK-LABEL: define available_externally <2 x i64> @_mm_load_si128
615 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8
616 // CHECK: load <2 x i64>, <2 x i64>* %[[ADDR]], align 16
617 
618 // CHECK-LABEL: define available_externally <2 x double> @_mm_load1_pd
619 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
620 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load double, double* %[[ADDR]], align 8
621 // CHECK: call <2 x double> @vec_splats(double)(double noundef %[[VAL]])
622 
623 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadh_pd
624 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
625 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load double, double* %{{[0-9a-zA-Z_.]+}}, align 8
626 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16
627 // CHECK: insertelement <2 x double> %[[VEC]], double %[[VAL]], i32 1
628 
629 // CHECK-LABEL: define available_externally <2 x i64> @_mm_loadl_epi64
630 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef 0, i64 noundef %{{[0-9a-zA-Z_.]+}})
631 
632 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadl_pd
633 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
634 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = load double, double* %[[ADDR]], align 8
635 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16
636 // CHECK: insertelement <2 x double> %[[VEC]], double %[[ADDR2]], i32 0
637 
638 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadr_pd
639 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
640 // CHECK: call <2 x double> @_mm_load_pd(double* noundef %[[ADDR]])
641 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 1, i32 2>
642 
643 // CHECK-LABEL: define available_externally <2 x double> @_mm_loadu_pd
644 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
645 // CHECK: call <2 x double> @vec_vsx_ld(int, double const*)(i32 noundef signext 0, double* noundef %[[ADDR]])
646 
647 // CHECK-LABEL: define available_externally <2 x i64> @_mm_loadu_si128
648 // CHECK: load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8
649 // CHECK: call <4 x i32> @vec_vsx_ld(int, int const*)(i32 noundef signext 0, i32* noundef %{{[0-9a-zA-Z_.]+}})
650 
651 void __attribute__((noinline))
652 test_logical() {
653   resd = _mm_and_pd(md1, md2);
654   resi = _mm_and_si128(mi1, mi2);
655   resd = _mm_andnot_pd(md1, md2);
656   resi = _mm_andnot_si128(mi1, mi2);
657   resd = _mm_xor_pd(md1, md2);
658   resi = _mm_xor_si128(mi1, mi2);
659   resd = _mm_or_pd(md1, md2);
660   resi = _mm_or_si128(mi1, mi2);
661 }
662 
663 // CHECK-LABEL: @test_logical
664 
665 // CHECK-LABEL: define available_externally <2 x double> @_mm_and_pd
666 // CHECK: call <2 x double> @vec_and(double vector[2], double vector[2])
667 
668 // CHECK-LABEL: define available_externally <2 x i64> @_mm_and_si128
669 // CHECK: call <2 x i64> @vec_and(long long vector[2], long long vector[2])
670 
671 // CHECK-LABEL: define available_externally <2 x double> @_mm_andnot_pd
672 // CHECK: call <2 x double> @vec_andc(double vector[2], double vector[2])
673 
674 // CHECK-LABEL: define available_externally <2 x i64> @_mm_andnot_si128
675 // CHECK: call <2 x i64> @vec_andc(long long vector[2], long long vector[2])
676 
677 // CHECK-LABEL: define available_externally <2 x double> @_mm_xor_pd
678 // CHECK: call <2 x double> @vec_xor(double vector[2], double vector[2])
679 
680 // CHECK-LABEL: define available_externally <2 x i64> @_mm_xor_si128
681 // CHECK: call <2 x i64> @vec_xor(long long vector[2], long long vector[2])
682 
683 // CHECK-LABEL: define available_externally <2 x double> @_mm_or_pd
684 // CHECK: call <2 x double> @vec_or(double vector[2], double vector[2])
685 
686 // CHECK-LABEL: define available_externally <2 x i64> @_mm_or_si128
687 // CHECK: call <2 x i64> @vec_or(long long vector[2], long long vector[2])
688 
689 void __attribute__((noinline))
690 test_max() {
691   resi = _mm_max_epi16(mi1, mi2);
692   resi = _mm_max_epu8(mi1, mi2);
693   resd = _mm_max_pd(md1, md2);
694   resd = _mm_max_sd(md1, md2);
695 }
696 
697 // CHECK-LABEL: @test_max
698 
699 // CHECK-LABEL: define available_externally <2 x i64> @_mm_max_epi16
700 // CHECK: call <8 x i16> @vec_max(short vector[8], short vector[8])
701 
702 // CHECK-LABEL: define available_externally <2 x i64> @_mm_max_epu8
703 // CHECK: call <16 x i8> @vec_max(unsigned char vector[16], unsigned char vector[16])
704 
705 // CHECK-LABEL: define available_externally <2 x double> @_mm_max_pd
706 // CHECK: call <2 x double> @vec_max(double vector[2], double vector[2])
707 
708 // CHECK-LABEL: define available_externally <2 x double> @_mm_max_sd
709 // CHECK: call <2 x double> @vec_splats(double)
710 // CHECK: call <2 x double> @vec_splats(double)
711 // CHECK: call <2 x double> @vec_max(double vector[2], double vector[2])
712 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
713 
714 void __attribute__((noinline))
715 test_min() {
716   resi = _mm_min_epi16(mi1, mi2);
717   resi = _mm_min_epu8(mi1, mi2);
718   resd = _mm_min_pd(md1, md2);
719   resd = _mm_min_sd(md1, md2);
720 }
721 
722 // CHECK-LABEL: @test_min
723 
724 // CHECK-LABEL: define available_externally <2 x i64> @_mm_min_epi16
725 // CHECK: call <8 x i16> @vec_min(short vector[8], short vector[8])
726 
727 // CHECK-LABEL: define available_externally <2 x i64> @_mm_min_epu8
728 // CHECK: call <16 x i8> @vec_min(unsigned char vector[16], unsigned char vector[16])
729 
730 // CHECK-LABEL: define available_externally <2 x double> @_mm_min_pd
731 // CHECK: call <2 x double> @vec_min(double vector[2], double vector[2])
732 
733 // CHECK-LABEL: define available_externally <2 x double> @_mm_min_sd
734 // CHECK: call <2 x double> @vec_splats(double)
735 // CHECK: call <2 x double> @vec_splats(double)
736 // CHECK: call <2 x double> @vec_min(double vector[2], double vector[2])
737 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
738 
739 void __attribute__((noinline))
740 test_move() {
741   resi = _mm_move_epi64(mi1);
742   resd = _mm_move_sd(md1, md2);
743   i = _mm_movemask_epi8(mi1);
744   i = _mm_movemask_pd(md1);
745   res64 = _mm_movepi64_pi64(mi1);
746   resi = _mm_movpi64_epi64(m641);
747   _mm_maskmoveu_si128(mi1, mi2, chs);
748 }
749 
750 // CHECK-LABEL: @test_move
751 
752 // CHECK-LABEL: define available_externally <2 x i64> @_mm_move_epi64
753 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef 0, i64 noundef %{{[0-9a-zA-Z_.]+}})
754 
755 // CHECK-LABEL: define available_externally <2 x double> @_mm_move_sd
756 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = extractelement <2 x double> %{{[0-9a-zA-Z_.]+}}, i32 0
757 // CHECK: insertelement <2 x double> %{{[0-9a-zA-Z_.]+}}, double %[[EXT]], i32 0
758 
759 // CHECK-LABEL: define available_externally signext i32 @_mm_movemask_epi8
760 // CHECK: call <2 x i64> @vec_vbpermq(unsigned char vector[16], unsigned char vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef <i8 120, i8 112, i8 104, i8 96, i8 88, i8 80, i8 72, i8 64, i8 56, i8 48, i8 40, i8 32, i8 24, i8 16, i8 8, i8 0>)
761 // CHECK-LE: %[[VAL:[0-9a-zA-Z_.]+]] = extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 1
762 // CHECK-BE: %[[VAL:[0-9a-zA-Z_.]+]] = extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0
763 // CHECK: trunc i64 %[[VAL]] to i32
764 
765 // CHECK-LABEL: define available_externally signext i32 @_mm_movemask_pd
766 // CHECK-LE: call <2 x i64> @vec_vbpermq(unsigned char vector[16], unsigned char vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef bitcast (<4 x i32> <i32 -2139094976, i32 -2139062144, i32 -2139062144, i32 -2139062144> to <16 x i8>))
767 // CHECK-LE: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 1
768 // CHECK-BE: call <2 x i64> @vec_vbpermq(unsigned char vector[16], unsigned char vector[16])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef bitcast (<4 x i32> <i32 -2139062144, i32 -2139062144, i32 -2139062144, i32 -2139078656> to <16 x i8>))
769 // CHECK-BE: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0
770 
771 // CHECK-LABEL: define available_externally i64 @_mm_movepi64_pi64
772 // CHECK: extractelement <2 x i64> %{{[0-9a-zA-Z_.]+}}, i32 0
773 
774 // CHECK-LABEL: define available_externally <2 x i64> @_mm_movpi64_epi64
775 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef 0, i64 noundef %{{[0-9a-zA-Z_.]+}})
776 
777 // CHECK-LABEL: define available_externally void @_mm_maskmoveu_si128
778 // CHECK: call <2 x i64> @_mm_loadu_si128(<2 x i64>* noundef %{{[0-9a-zA-Z_.]+}})
779 // CHECK: call <16 x i8> @vec_cmpgt(unsigned char vector[16], unsigned char vector[16])
780 // CHECK: call <16 x i8> @vec_sel(unsigned char vector[16], unsigned char vector[16], unsigned char vector[16])
781 // CHECK: call void @_mm_storeu_si128(<2 x i64>* noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef %{{[0-9a-zA-Z_.]+}})
782 
783 void __attribute__((noinline))
784 test_mul() {
785   resi = _mm_mul_epu32(mi1, mi2);
786   resd = _mm_mul_pd(md1, md2);
787   resd = _mm_mul_sd(md1, md2);
788   res64 = _mm_mul_su32(m641, m642);
789   resi = _mm_mulhi_epi16(mi1, mi2);
790   resi = _mm_mulhi_epu16(mi1, mi2);
791   resi = _mm_mullo_epi16(mi1, mi2);
792 }
793 
794 // CHECK-LABEL: @test_mul
795 
796 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mul_epu32
797 // CHECK-LE: call <2 x i64> asm "vmulouw $0,$1,$2", "=v,v,v"(<2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}})
798 // CHECK-BE: call <2 x i64> asm "vmuleuw $0,$1,$2", "=v,v,v"(<2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}})
799 
800 // CHECK-LABEL: define available_externally <2 x double> @_mm_mul_pd
801 // CHECK: fmul <2 x double>
802 
803 // CHECK-LABEL: define available_externally <2 x double> @_mm_mul_sd
804 // CHECK: fmul double
805 
806 // CHECK-LABEL: define available_externally i64 @_mm_mul_su32
807 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
808 // CHECK: trunc i64 %{{[0-9a-zA-Z_.]+}} to i32
809 // CHECK: %[[EXT1:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64
810 // CHECK: %[[EXT2:[0-9a-zA-Z_.]+]] = zext i32 %{{[0-9a-zA-Z_.]+}} to i64
811 // CHECK: mul i64 %[[EXT1]], %[[EXT2]]
812 
813 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mulhi_epi16
814 // 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>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
815 // CHECK-BE: store <16 x i8> <i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21, i8 8, i8 9, i8 24, i8 25, i8 12, i8 13, i8 28, i8 29>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
816 // CHECK: call <4 x i32> @vec_vmulesh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}})
817 // CHECK: call <4 x i32> @vec_vmulosh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}})
818 // CHECK: call <4 x i32> @vec_perm(int vector[4], int vector[4], unsigned char vector[16])
819 
820 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mulhi_epu16
821 // 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>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
822 // CHECK-BE: store <16 x i8> <i8 0, i8 1, i8 16, i8 17, i8 4, i8 5, i8 20, i8 21, i8 8, i8 9, i8 24, i8 25, i8 12, i8 13, i8 28, i8 29>, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
823 // CHECK: call <4 x i32> @vec_vmuleuh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}})
824 // CHECK: call <4 x i32> @vec_vmulouh(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef %{{[0-9a-zA-Z_.]+}})
825 // CHECK: call <4 x i32> @vec_perm(unsigned int vector[4], unsigned int vector[4], unsigned char vector[16])
826 
827 // CHECK-LABEL: define available_externally <2 x i64> @_mm_mullo_epi16
828 // CHECK: mul <8 x i16>
829 
830 void __attribute__((noinline))
831 test_pack() {
832   resi = _mm_packs_epi16(mi1, mi2);
833   resi = _mm_packs_epi32(mi1, mi2);
834   resi = _mm_packus_epi16(mi1, mi2);
835 }
836 
837 // CHECK-LABEL: @test_pack
838 
839 // CHECK-LABEL: define available_externally <2 x i64> @_mm_packs_epi16
840 // CHECK: call <16 x i8> @vec_packs(short vector[8], short vector[8])
841 
842 // CHECK-LABEL: define available_externally <2 x i64> @_mm_packs_epi32
843 // CHECK: call <8 x i16> @vec_packs(int vector[4], int vector[4])
844 
845 // CHECK-LABEL: define available_externally <2 x i64> @_mm_packus_epi16
846 // CHECK: call <16 x i8> @vec_packsu(short vector[8], short vector[8])
847 
848 void __attribute__((noinline))
849 test_sad() {
850   resi = _mm_sad_epu8(mi1, mi2);
851 }
852 
853 // CHECK-LABEL: @test_sad
854 
855 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sad_epu8
856 // CHECK: call <16 x i8> @vec_min(unsigned char vector[16], unsigned char vector[16])
857 // CHECK: call <16 x i8> @vec_max(unsigned char vector[16], unsigned char vector[16])
858 // CHECK: call <16 x i8> @vec_sub(unsigned char vector[16], unsigned char vector[16])
859 // CHECK: call <4 x i32> @vec_sum4s(unsigned char vector[16], unsigned int vector[4])(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef zeroinitializer)
860 // CHECK: call <4 x i32> @vec_sum2s(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef zeroinitializer)
861 // CHECK-LE: call <4 x i32> @vec_sld(int vector[4], int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 4)
862 // CHECK-BE: call <4 x i32> @vec_sld(int vector[4], int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 6)
863 
864 void __attribute__((noinline))
865 test_set() {
866   resi = _mm_set_epi16(ss[7], ss[6], ss[5], ss[4], ss[3], ss[2], ss[1], ss[0]);
867   resi = _mm_set_epi32(is[3], is[2], is[1], is[0]);
868   resi = _mm_set_epi64(m641, m642);
869   resi = _mm_set_epi64x(i64s[0], i64s[1]);
870   resi = _mm_set_epi8(chs[15], chs[14], chs[13], chs[12], chs[11], chs[10], chs[9], chs[8], chs[7], chs[6], chs[5], chs[4], chs[3], chs[2], chs[1], chs[0]);
871   resd = _mm_set_pd(dp[0], dp[1]);
872   resd = _mm_set_pd1(dp[0]);
873   resd = _mm_set_sd(dp[0]);
874   resi = _mm_set1_epi16(ss[0]);
875   resi = _mm_set1_epi32(i);
876   resi = _mm_set1_epi64(m641);
877   resi = _mm_set1_epi64x(i64s[0]);
878   resi = _mm_set1_epi8(chs[0]);
879   resd = _mm_set1_pd(dp[0]);
880   resi = _mm_setr_epi16(ss[7], ss[6], ss[5], ss[4], ss[3], ss[2], ss[1], ss[0]);
881   resi = _mm_setr_epi32(is[3], is[2], is[1], is[0]);
882   resi = _mm_setr_epi64(m641, m642);
883   resi = _mm_setr_epi8(chs[15], chs[14], chs[13], chs[12], chs[11], chs[10], chs[9], chs[8], chs[7], chs[6], chs[5], chs[4], chs[3], chs[2], chs[1], chs[0]);
884   resd = _mm_setr_pd(dp[0], dp[1]);
885   resd = _mm_setzero_pd();
886   resi = _mm_setzero_si128();
887 }
888 
889 // CHECK-LABEL: @test_set
890 
891 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi16
892 // CHECK-COUNT-8: store i16 {{[0-9a-zA-Z_%.]+}}, i16* {{[0-9a-zA-Z_%.]+}}, align 2
893 // CHECK: insertelement <8 x i16> undef, i16 {{[0-9a-zA-Z_%.]+}}, i32 0
894 // CHECK-COUNT-7: insertelement <8 x i16> {{[0-9a-zA-Z_%.]+}}, i16 {{[0-9a-zA-Z_%.]+}}, i32 {{[1-7]}}
895 
896 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi32
897 // CHECK-COUNT-4: store i32 {{[0-9a-zA-Z_%.]+}}, i32* {{[0-9a-zA-Z_%.]+}}, align 4
898 // CHECK: insertelement <4 x i32> undef, i32 {{[0-9a-zA-Z_%.]+}}, i32 0
899 // CHECK-COUNT-3: insertelement <4 x i32> {{[0-9a-zA-Z_%.]+}}, i32 {{[0-9a-zA-Z_%.]+}}, i32 {{[1-3]}}
900 
901 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi64
902 // CHECK: call <2 x i64> @_mm_set_epi64x(i64 noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef %{{[0-9a-zA-Z_.]+}})
903 
904 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi64x
905 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x i64> undef, i64 %{{[0-9a-zA-Z_.]+}}, i32 0
906 // CHECK: insertelement <2 x i64> %[[VEC]], i64 %{{[0-9a-zA-Z_.]+}}, i32 1
907 
908 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set_epi8
909 // CHECK-COUNT-16: store i8 {{[0-9a-zA-Z_%.]+}}, i8* {{[0-9a-zA-Z_%.]+}}, align 1
910 // CHECK: insertelement <16 x i8> undef, i8 {{[0-9a-zA-Z_%.]+}}, i32 {{[0-9]+}}
911 // CHECK-COUNT-15: {{[0-9a-zA-Z_%.]+}} = insertelement <16 x i8> {{[0-9a-zA-Z_%.]+}}, i8 {{[0-9a-zA-Z_%.]+}}, i32 {{[0-9]+}}
912 
913 // CHECK-LABEL: define available_externally <2 x double> @_mm_set_pd
914 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0
915 // CHECK: insertelement <2 x double> %[[VEC]], double %{{[0-9a-zA-Z_.]+}}, i32 1
916 
917 // CHECK-LABEL: define available_externally <2 x double> @_mm_set_pd1
918 // CHECK: call <2 x double> @_mm_set1_pd(double noundef %{{[0-9a-zA-Z_.]+}})
919 
920 // CHECK-LABEL: define available_externally <2 x double> @_mm_set_sd
921 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0
922 // CHECK: insertelement <2 x double> %[[VEC]], double 0.000000e+00, i32 1
923 
924 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi16
925 // CHECK-COUNT-8: load i16, i16* %{{[0-9a-zA-Z_.]+}}, align 2
926 // CHECK: call <2 x i64> @_mm_set_epi16
927 
928 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi32
929 // CHECK-COUNT-4: load i32, i32* %{{[0-9a-zA-Z_.]+}}, align 4
930 // CHECK: call <2 x i64> @_mm_set_epi32
931 
932 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi64
933 // CHECK: %[[VAL1:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
934 // CHECK: %[[VAL2:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
935 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef %[[VAL1]], i64 noundef %[[VAL2]])
936 
937 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi64x
938 // CHECK: %[[VAL1:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
939 // CHECK: %[[VAL2:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
940 // CHECK: call <2 x i64> @_mm_set_epi64x(i64 noundef %[[VAL1]], i64 noundef %[[VAL2]])
941 
942 // CHECK-LABEL: define available_externally <2 x i64> @_mm_set1_epi8
943 // CHECK-COUNT-16: load i8, i8* %{{[0-9a-zA-Z_.]+}}, align 1
944 // CHECK: call <2 x i64> @_mm_set_epi8
945 
946 // CHECK-LABEL: define available_externally <2 x double> @_mm_set1_pd
947 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0
948 // CHECK: insertelement <2 x double> %[[VEC]], double %{{[0-9a-zA-Z_.]+}}, i32 1
949 
950 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi16
951 // CHECK-COUNT-8: load i16, i16* {{[0-9a-zA-Z_%.]+}}, align 2
952 // CHECK: call <2 x i64> @_mm_set_epi16
953 
954 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi32
955 // CHECK-COUNT-4: load i32, i32* {{[0-9a-zA-Z_%.]+}}, align 4
956 // CHECK: call <2 x i64> @_mm_set_epi32
957 
958 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi64
959 // CHECK: %[[VAL1:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
960 // CHECK: %[[VAL2:[0-9a-zA-Z_.]+]] = load i64, i64* %{{[0-9a-zA-Z_.]+}}, align 8
961 // CHECK: call <2 x i64> @_mm_set_epi64(i64 noundef %[[VAL1]], i64 noundef %[[VAL2]])
962 
963 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setr_epi8
964 // CHECK-COUNT-16: load i8, i8* {{[0-9a-zA-Z_%.]+}}, align 1
965 // CHECK: call <2 x i64> @_mm_set_epi8
966 
967 // CHECK-LABEL: define available_externally <2 x double> @_mm_setr_pd
968 // CHECK: %[[VEC:[0-9a-zA-Z_.]+]] = insertelement <2 x double> undef, double %{{[0-9a-zA-Z_.]+}}, i32 0
969 // CHECK: insertelement <2 x double> %[[VEC]], double %{{[0-9a-zA-Z_.]+}}, i32 1
970 
971 // CHECK-LABEL: define available_externally <2 x double> @_mm_setzero_pd()
972 // CHECK: call <4 x i32> @vec_splats(int)(i32 noundef signext 0)
973 
974 // CHECK-LABEL: define available_externally <2 x i64> @_mm_setzero_si128()
975 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16
976 
977 void __attribute__((noinline))
978 test_shuffle() {
979   resi = _mm_shuffle_epi32(mi1, i);
980   resd = _mm_shuffle_pd(md1, md2, i);
981   resi = _mm_shufflehi_epi16(mi1, i);
982   resi = _mm_shufflelo_epi16(mi1, i);
983 }
984 
985 // CHECK-LABEL: @test_shuffle
986 
987 // CHECK-LABEL: define available_externally <2 x i64> @_mm_shuffle_epi32
988 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 %{{[0-9a-zA-Z_.]+}}, 3
989 // CHECK: sext i32 %[[AND]] to i64
990 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 2
991 // CHECK: %[[AND2:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3
992 // CHECK: sext i32 %[[AND2]] to i64
993 // CHECK: %[[SHR2:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 4
994 // CHECK: %[[AND3:[0-9a-zA-Z_.]+]] = and i32 %[[SHR2]], 3
995 // CHECK: sext i32 %[[AND3]] to i64
996 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 6
997 // CHECK: %[[AND4:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3
998 // CHECK: sext i32 %[[AND4]] to i64
999 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}}
1000 // CHECK: insertelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 %{{[0-9a-zA-Z_.]+}}, i32 0
1001 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}}
1002 // CHECK: insertelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 %{{[0-9a-zA-Z_.]+}}, i32 1
1003 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}}
1004 // CHECK: %[[ADD:[0-9a-zA-Z_.]+]] = add i32 %{{[0-9a-zA-Z_.]+}}, 269488144
1005 // CHECK: insertelement <4 x i32> %{{[0-9a-zA-Z_.]+}}, i32 %[[ADD]], i32 2
1006 // CHECK: getelementptr inbounds [4 x i32], [4 x i32]* @_mm_shuffle_epi32.permute_selectors, i64 0, i64 %{{[0-9a-zA-Z_.]+}}
1007 // CHECK: add i32 %{{[0-9a-zA-Z_.]+}}, 269488144
1008 // CHECK: call <4 x i32> @vec_perm(int vector[4], int vector[4], unsigned char vector[16])
1009 
1010 // CHECK-LABEL: define available_externally <2 x double> @_mm_shuffle_pd
1011 // CHECK: and i32 %{{[0-9a-zA-Z_.]+}}, 3
1012 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, 0
1013 // CHECK: br i1 %[[CMP]]
1014 // CHECK: call <2 x double> @vec_mergeh(double vector[2], double vector[2])
1015 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, 1
1016 // CHECK: br i1 %[[CMP2]]
1017 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 1, i32 2>
1018 // CHECK: %[[CMP3:[0-9a-zA-Z_.]+]] = icmp eq i32 %{{[0-9a-zA-Z_.]+}}, 2
1019 // CHECK: br i1 %[[CMP3]]
1020 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 0, i32 3>
1021 // CHECK: call <2 x double> @vec_mergel(double vector[2], double vector[2])
1022 
1023 // CHECK-LABEL: define available_externally <2 x i64> @_mm_shufflehi_epi16
1024 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 %{{[0-9a-zA-Z_.]+}}, 3
1025 // CHECK: sext i32 %[[AND]] to i64
1026 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 2
1027 // CHECK: %[[AND2:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3
1028 // CHECK: sext i32 %[[AND2]] to i64
1029 // CHECK: %[[SHR2:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 4
1030 // CHECK: %[[AND3:[0-9a-zA-Z_.]+]] = and i32 %[[SHR2]], 3
1031 // CHECK: sext i32 %[[AND3]] to i64
1032 // CHECK: %[[SHR3:[0-9a-zA-Z_.]+]] = ashr i32 %{{[0-9a-zA-Z_.]+}}, 6
1033 // CHECK: %[[AND4:[0-9a-zA-Z_.]+]] = and i32 %[[SHR3]], 3
1034 // CHECK: sext i32 %[[AND4]] to i64
1035 // CHECK-LE: store <2 x i64> <i64 1663540288323457296, i64 0>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16
1036 // CHECK-BE: store <2 x i64> <i64 1157726452361532951, i64 0>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16
1037 // CHECK-COUNT-4: getelementptr inbounds [4 x i16], [4 x i16]* @_mm_shufflehi_epi16.permute_selectors, i64 0, i64 {{[0-9a-zA-Z_%.]+}}
1038 // CHECK: call <2 x i64> @vec_perm(unsigned long long vector[2], unsigned long long vector[2], unsigned char vector[16])
1039 
1040 // CHECK-LABEL: define available_externally <2 x i64> @_mm_shufflelo_epi16
1041 // CHECK: %[[AND:[0-9a-zA-Z_.]+]] = and i32 {{[0-9a-zA-Z_%.]+}}, 3
1042 // CHECK: sext i32 %[[AND]] to i64
1043 // CHECK: %[[SHR:[0-9a-zA-Z_.]+]] = ashr i32 {{[0-9a-zA-Z_%.]+}}, 2
1044 // CHECK: %[[AND2:[0-9a-zA-Z_.]+]] = and i32 %[[SHR]], 3
1045 // CHECK: sext i32 %[[AND2]] to i64
1046 // CHECK: %[[SHR2:[0-9a-zA-Z_.]+]] = ashr i32 {{[0-9a-zA-Z_%.]+}}, 4
1047 // CHECK: %[[AND3:[0-9a-zA-Z_.]+]] = and i32 %[[SHR2]], 3
1048 // CHECK: sext i32 %[[AND3]] to i64
1049 // CHECK: %[[SHR3:[0-9a-zA-Z_.]+]] = ashr i32 {{[0-9a-zA-Z_%.]+}}, 6
1050 // CHECK: %[[AND4:[0-9a-zA-Z_.]+]] = and i32 %[[SHR3]], 3
1051 // CHECK: sext i32 %[[AND4]] to i64
1052 // CHECK-LE: store <2 x i64> <i64 0, i64 2242261671028070680>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16
1053 // CHECK-BE: store <2 x i64> <i64 0, i64 1736447835066146335>, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16
1054 // CHECK-COUNT-4: getelementptr inbounds [4 x i16], [4 x i16]* @_mm_shufflelo_epi16.permute_selectors, i64 0, i64 {{[0-9a-zA-Z_%.]+}}
1055 // CHECK: call <2 x i64> @vec_perm(unsigned long long vector[2], unsigned long long vector[2], unsigned char vector[16])
1056 
1057 void __attribute__((noinline))
1058 test_sll() {
1059   resi = _mm_sll_epi16(mi1, mi2);
1060   resi = _mm_sll_epi32(mi1, mi2);
1061   resi = _mm_sll_epi64(mi1, mi2);
1062   resi = _mm_slli_epi16(mi1, i);
1063   resi = _mm_slli_epi32(mi1, i);
1064   resi = _mm_slli_epi64(mi1, i);
1065   resi = _mm_slli_si128(mi1, i);
1066 }
1067 
1068 // CHECK-LABEL: @test_sll
1069 
1070 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sll_epi16
1071 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16
1072 // CHECK-LE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)
1073 // CHECK-BE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)
1074 // CHECK: call <8 x i16> @vec_cmple(unsigned short vector[8], unsigned short vector[8])(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>)
1075 // CHECK: call <8 x i16> @vec_sl(unsigned short vector[8], unsigned short vector[8])
1076 // CHECK: call <8 x i16> @vec_sel(unsigned short vector[8], unsigned short vector[8], bool vector[8])
1077 
1078 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sll_epi32
1079 // CHECK-LE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
1080 // CHECK-BE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 1)
1081 // CHECK: call <4 x i32> @vec_cmplt(unsigned int vector[4], unsigned int vector[4])(<4 x i32> noundef {{[0-9a-zA-Z_%.]+}}, <4 x i32> noundef <i32 32, i32 32, i32 32, i32 32>)
1082 // CHECK: call <4 x i32> @vec_sl(unsigned int vector[4], unsigned int vector[4])
1083 // CHECK: call <4 x i32> @vec_sel(unsigned int vector[4], unsigned int vector[4], bool vector[4])
1084 
1085 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sll_epi64
1086 // CHECK: call <2 x i64> @vec_splat(unsigned long long vector[2], unsigned int)(<2 x i64> noundef {{[0-9a-zA-Z_%.]+}}, i32 noundef zeroext 0)
1087 // CHECK: call <2 x i64> @vec_cmplt(unsigned long long vector[2], unsigned long long vector[2])(<2 x i64> noundef {{[0-9a-zA-Z_%.]+}}, <2 x i64> noundef <i64 64, i64 64>)
1088 // CHECK: call <2 x i64> @vec_sl(unsigned long long vector[2], unsigned long long vector[2])
1089 // CHECK: call <2 x double> @vec_sel(double vector[2], double vector[2], bool vector[2])
1090 
1091 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_epi16
1092 // CHECK: store <8 x i16> zeroinitializer, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16
1093 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp sge i32 %{{[0-9a-zA-Z_.]+}}, 0
1094 // CHECK: br i1 %[[CMP]]
1095 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1096 // CHECK: br i1 %[[CMP2]]
1097 // CHECK: call i1 @llvm.is.constant
1098 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1099 // CHECK: call <8 x i16> @vec_splat_s16(signed char)(i8 noundef signext %[[TRUNC]])
1100 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i16
1101 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %[[TRUNC2]])
1102 // CHECK: call <8 x i16> @vec_sl(short vector[8], unsigned short vector[8])
1103 
1104 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_epi32
1105 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16
1106 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp sge i32 %{{[0-9a-zA-Z_.]+}}, 0
1107 // CHECK: br i1 %[[CMP]]
1108 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 32
1109 // CHECK: br i1 %[[CMP2]]
1110 // CHECK: call i1 @llvm.is.constant
1111 // CHECK: %[[CMP3:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1112 // CHECK: br i1 %[[CMP3]]
1113 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1114 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]])
1115 // CHECK: call <4 x i32> @vec_splats(unsigned int)
1116 // CHECK: call <4 x i32> @vec_sl(int vector[4], unsigned int vector[4])
1117 
1118 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_epi64
1119 // CHECK: store <2 x i64> zeroinitializer, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16
1120 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp sge i32 %{{[0-9a-zA-Z_.]+}}, 0
1121 // CHECK: br i1 %[[CMP]]
1122 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 64
1123 // CHECK: br i1 %[[CMP2]]
1124 // CHECK: call i1 @llvm.is.constant
1125 // CHECK: %[[CMP3:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1126 // CHECK: br i1 %[[CMP3]]
1127 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1128 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]])
1129 // CHECK: call <4 x i32> @vec_splats(unsigned int)
1130 // CHECK: call <2 x i64> @vec_sl(long long vector[2], unsigned long long vector[2])
1131 
1132 // CHECK-LABEL: define available_externally <2 x i64> @_mm_slli_si128
1133 // CHECK: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
1134 // CHECK-BE: %[[SUB:[0-9a-zA-Z_.]+]] = sub nsw i32 16, %{{[0-9a-zA-Z_.]+}}
1135 // CHECK-BE: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef zeroinitializer, <16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext %[[SUB]])
1136 // CHECK-LE: call <16 x i8> @vec_sld(unsigned char vector[16], unsigned char vector[16], unsigned int)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, <16 x i8> noundef zeroinitializer, i32 noundef zeroext %{{[0-9a-zA-Z_.]+}})
1137 // CHECK: store <16 x i8> zeroinitializer, <16 x i8>* %{{[0-9a-zA-Z_.]+}}, align 16
1138 
1139 void __attribute__((noinline))
1140 test_sqrt() {
1141   resd = _mm_sqrt_pd(md1);
1142   resd = _mm_sqrt_sd(md1, md2);
1143 }
1144 
1145 // CHECK-LABEL: @test_sqrt
1146 
1147 // CHECK-LABEL: define available_externally <2 x double> @_mm_sqrt_pd
1148 // CHECK: call <2 x double> @vec_sqrt(double vector[2])(<2 x double> noundef {{[0-9a-zA-Z_%.]+}})
1149 
1150 // CHECK-LABEL: define available_externally <2 x double> @_mm_sqrt_sd
1151 // CHECK: %[[CALL:[0-9a-zA-Z_.]+]] = call <2 x double> @_mm_set1_pd(double noundef %{{[0-9a-zA-Z_.]+}})
1152 // CHECK: call <2 x double> @vec_sqrt(double vector[2])(<2 x double> noundef %{{[0-9a-zA-Z_.]+}})
1153 // CHECK: call <2 x double> @_mm_setr_pd(double noundef %{{[0-9a-zA-Z_.]+}}, double noundef %{{[0-9a-zA-Z_.]+}})
1154 
1155 void __attribute__((noinline))
1156 test_sra() {
1157   resi = _mm_sra_epi16(mi1, mi2);
1158   resi = _mm_sra_epi32(mi1, mi2);
1159   resi = _mm_srai_epi16(mi1, i);
1160   resi = _mm_srai_epi32(mi1, i);
1161 }
1162 
1163 // CHECK-LABEL: @test_sra
1164 
1165 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sra_epi16
1166 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16
1167 // CHECK-LE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
1168 // CHECK-BE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 3)
1169 // CHECK: call <8 x i16> @vec_min(unsigned short vector[8], unsigned short vector[8])(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>)
1170 // CHECK: call <8 x i16> @vec_sra(short vector[8], unsigned short vector[8])
1171 
1172 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sra_epi32
1173 // CHECK: store <4 x i32> <i32 31, i32 31, i32 31, i32 31>, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16
1174 // CHECK-LE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
1175 // CHECK-BE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 1)
1176 // CHECK: call <4 x i32> @vec_min(unsigned int vector[4], unsigned int vector[4])(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef <i32 31, i32 31, i32 31, i32 31>)
1177 // CHECK: call <4 x i32> @vec_sra(int vector[4], unsigned int vector[4])
1178 
1179 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srai_epi16
1180 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16
1181 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1182 // CHECK: br i1 %[[CMP]]
1183 // CHECK: call i1 @llvm.is.constant
1184 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1185 // CHECK: call <8 x i16> @vec_splat_s16(signed char)(i8 noundef signext %[[TRUNC]])
1186 // CHECK: %[[TRUNC2:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i16
1187 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %{{[0-9a-zA-Z_.]+}})
1188 // CHECK: call <8 x i16> @vec_sra(short vector[8], unsigned short vector[8])
1189 
1190 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srai_epi32
1191 // CHECK: store <4 x i32> <i32 31, i32 31, i32 31, i32 31>, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16
1192 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 32
1193 // CHECK: br i1 %[[CMP]]
1194 // CHECK: call i1 @llvm.is.constant
1195 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1196 // CHECK: br i1 %[[CMP2]]
1197 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1198 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]])
1199 // CHECK: call <4 x i32> @vec_splats(unsigned int)
1200 // CHECK: call <4 x i32> @vec_splats(unsigned int)
1201 // CHECK: call <4 x i32> @vec_sra(int vector[4], unsigned int vector[4])
1202 
1203 void __attribute__((noinline))
1204 test_srl() {
1205   resi = _mm_srl_epi16(mi1, mi2);
1206   resi = _mm_srl_epi32(mi1, mi2);
1207   resi = _mm_srl_epi64(mi1, mi2);
1208   resi = _mm_srli_epi16(mi1, i);
1209   resi = _mm_srli_epi32(mi1, i);
1210   resi = _mm_srli_epi64(mi1, i);
1211   resi = _mm_srli_si128(mi1, i);
1212 }
1213 
1214 // CHECK-LABEL: @test_srl
1215 
1216 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srl_epi16
1217 // CHECK: store <8 x i16> <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16
1218 // CHECK-LE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
1219 // CHECK-BE: call <8 x i16> @vec_splat(unsigned short vector[8], unsigned int)(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 3)
1220 // CHECK: call <8 x i16> @vec_cmple(unsigned short vector[8], unsigned short vector[8])(<8 x i16> noundef %{{[0-9a-zA-Z_.]+}}, <8 x i16> noundef <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>)
1221 // CHECK: call <8 x i16> @vec_sr(unsigned short vector[8], unsigned short vector[8])
1222 // CHECK: call <8 x i16> @vec_sel(unsigned short vector[8], unsigned short vector[8], bool vector[8])
1223 
1224 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srl_epi32
1225 // CHECK-LE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
1226 // CHECK-BE: call <4 x i32> @vec_splat(unsigned int vector[4], unsigned int)(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 1)
1227 // CHECK: call <4 x i32> @vec_cmplt(unsigned int vector[4], unsigned int vector[4])(<4 x i32> noundef %{{[0-9a-zA-Z_.]+}}, <4 x i32> noundef <i32 32, i32 32, i32 32, i32 32>)
1228 // CHECK: call <4 x i32> @vec_sr(unsigned int vector[4], unsigned int vector[4])
1229 // CHECK: call <4 x i32> @vec_sel(unsigned int vector[4], unsigned int vector[4], bool vector[4])
1230 
1231 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srl_epi64
1232 // CHECK: call <2 x i64> @vec_splat(unsigned long long vector[2], unsigned int)(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, i32 noundef zeroext 0)
1233 // CHECK: call <2 x i64> @vec_cmplt(unsigned long long vector[2], unsigned long long vector[2])(<2 x i64> noundef %{{[0-9a-zA-Z_.]+}}, <2 x i64> noundef <i64 64, i64 64>)
1234 // CHECK: call <2 x i64> @vec_sr(unsigned long long vector[2], unsigned long long vector[2])
1235 // CHECK: call <2 x double> @vec_sel(double vector[2], double vector[2], bool vector[2])
1236 
1237 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_epi16
1238 // CHECK: store <8 x i16> zeroinitializer, <8 x i16>* %{{[0-9a-zA-Z_.]+}}, align 16
1239 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1240 // CHECK: br i1 %[[CMP]]
1241 // CHECK: call i1 @llvm.is.constant
1242 // CHECK: trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1243 // CHECK: call <8 x i16> @vec_splat_s16(signed char)
1244 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i16
1245 // CHECK: call <8 x i16> @vec_splats(unsigned short)(i16 noundef zeroext %[[TRUNC]])
1246 // CHECK: call <8 x i16> @vec_sr(short vector[8], unsigned short vector[8])
1247 
1248 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_epi32
1249 // CHECK: store <4 x i32> zeroinitializer, <4 x i32>* %{{[0-9a-zA-Z_.]+}}, align 16
1250 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 32
1251 // CHECK: br i1 %[[CMP]]
1252 // CHECK: call i1 @llvm.is.constant
1253 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1254 // CHECK: br i1 %[[CMP2]]
1255 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1256 // CHECK: call <4 x i32> @vec_splat_s32(signed char)
1257 // CHECK: call <4 x i32> @vec_splats(unsigned int)
1258 // CHECK: call <4 x i32> @vec_splats(unsigned int)
1259 // CHECK: call <4 x i32> @vec_sr(int vector[4], unsigned int vector[4])
1260 
1261 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_epi64
1262 // CHECK: store <2 x i64> zeroinitializer, <2 x i64>* %{{[0-9a-zA-Z_.]+}}, align 16
1263 // CHECK: %[[CMP:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 64
1264 // CHECK: br i1 %[[CMP]]
1265 // CHECK: call i1 @llvm.is.constant
1266 // CHECK: %[[CMP2:[0-9a-zA-Z_.]+]] = icmp slt i32 %{{[0-9a-zA-Z_.]+}}, 16
1267 // CHECK: br i1 %[[CMP2]]
1268 // CHECK: %[[TRUNC:[0-9a-zA-Z_.]+]] = trunc i32 %{{[0-9a-zA-Z_.]+}} to i8
1269 // CHECK: call <4 x i32> @vec_splat_s32(signed char)(i8 noundef signext %[[TRUNC]])
1270 // CHECK: %[[EXT:[0-9a-zA-Z_.]+]] = sext i32 %{{[0-9a-zA-Z_.]+}} to i64
1271 // CHECK: call <2 x i64> @vec_splats(unsigned long long)(i64 noundef %[[EXT]])
1272 // CHECK: call <4 x i32> @vec_splats(unsigned int)(i32 noundef zeroext %{{[0-9a-zA-Z_.]+}})
1273 // CHECK: call <2 x i64> @vec_sr(long long vector[2], unsigned long long vector[2])
1274 
1275 // CHECK-LABEL: define available_externally <2 x i64> @_mm_srli_si128
1276 // CHECK: call <2 x i64> @_mm_bsrli_si128
1277 
1278 void __attribute__((noinline))
1279 test_store() {
1280   _mm_store_pd(dp, md1);
1281   _mm_store_pd1(dp, md1);
1282   _mm_store_sd(dp, md1);
1283   _mm_store_si128(mip, mi1);
1284   _mm_store1_pd(dp, md1);
1285   _mm_storeh_pd(dp, md1);
1286   _mm_storel_epi64(mip, mi1);
1287   _mm_storel_pd(dp, md1);
1288   _mm_storer_pd(dp, md1);
1289   _mm_storeu_pd(dp, md1);
1290   _mm_storeu_si128(mip, mi1);
1291 }
1292 
1293 // CHECK-LABEL: @test_store
1294 
1295 // CHECK-LABEL: define available_externally void @_mm_store_pd
1296 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
1297 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast double* %[[ADDR]] to <16 x i8>*
1298 // CHECK: call void @vec_st(unsigned char vector[16], long, unsigned char vector[16]*)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef 0, <16 x i8>* noundef %[[CAST]])
1299 
1300 // CHECK-LABEL: define available_externally void @_mm_store_pd1
1301 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
1302 // CHECK: %[[ADDR2:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16
1303 // CHECK: call void @_mm_store1_pd(double* noundef %[[ADDR]], <2 x double> noundef %[[ADDR2]])
1304 
1305 // CHECK-LABEL: define available_externally void @_mm_store_sd
1306 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
1307 // CHECK: store double %{{[0-9a-zA-Z_.]+}}, double* %[[ADDR]], align 8
1308 
1309 // CHECK-LABEL: define available_externally void @_mm_store_si128
1310 // CHECK: %[[LOAD:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8
1311 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast <2 x i64>* %[[LOAD]] to <16 x i8>*
1312 // CHECK: call void @vec_st(unsigned char vector[16], long, unsigned char vector[16]*)(<16 x i8> noundef %{{[0-9a-zA-Z_.]+}}, i64 noundef 0, <16 x i8>* noundef %[[CAST]])
1313 
1314 // CHECK-LABEL: define available_externally void @_mm_store1_pd
1315 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
1316 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16
1317 // CHECK: %[[CALL:[0-9a-zA-Z_.]+]] = call <2 x double> @vec_splat(double vector[2], unsigned int)(<2 x double> noundef %[[VAL]], i32 noundef zeroext 0)
1318 // CHECK: call void @_mm_store_pd(double* noundef %[[ADDR]], <2 x double> noundef %[[CALL]])
1319 
1320 // CHECK-LABEL: define available_externally void @_mm_storeh_pd
1321 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
1322 // CHECK: store double %{{[0-9a-zA-Z_.]+}}, double* %[[ADDR]], align 8
1323 
1324 // CHECK-LABEL: define available_externally void @_mm_storel_epi64
1325 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8
1326 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast <2 x i64>* %[[ADDR]] to i64*
1327 // CHECK: store i64 %{{[0-9a-zA-Z_.]+}}, i64* %[[CAST]], align 8
1328 
1329 // CHECK-LABEL: define available_externally void @_mm_storel_pd
1330 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
1331 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %{{[0-9a-zA-Z_.]+}}, align 16
1332 // CHECK: call void @_mm_store_sd(double* noundef %[[ADDR]], <2 x double> noundef %[[VAL]])
1333 
1334 // CHECK-LABEL: define available_externally void @_mm_storer_pd
1335 // CHECK: shufflevector <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i32> <i32 1, i32 2>
1336 // CHECK: call void @_mm_store_pd(double* noundef %{{[0-9a-zA-Z_.]+}}, <2 x double> noundef %{{[0-9a-zA-Z_.]+}})
1337 
1338 // CHECK-LABEL: define available_externally void @_mm_storeu_pd
1339 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load double*, double** %{{[0-9a-zA-Z_.]+}}, align 8
1340 // CHECK: %[[CAST:[0-9a-zA-Z_.]+]] = bitcast double* %[[ADDR]] to <2 x double>*
1341 // CHECK: store <2 x double> %{{[0-9a-zA-Z_.]+}}, <2 x double>* %[[CAST]], align 1
1342 
1343 // CHECK-LABEL: define available_externally void @_mm_storeu_si128
1344 // CHECK: %[[ADDR:[0-9a-zA-Z_.]+]] = load <2 x i64>*, <2 x i64>** %{{[0-9a-zA-Z_.]+}}, align 8
1345 // CHECK: store <2 x i64> %{{[0-9a-zA-Z_.]+}}, <2 x i64>* %[[ADDR]], align 1
1346 
1347 void __attribute__((noinline))
1348 test_stream() {
1349   _mm_stream_pd(dp, md1);
1350   _mm_stream_si128(mip, mi1);
1351   _mm_stream_si32(is, i);
1352   _mm_stream_si64(i64s, i64s[1]);
1353 }
1354 
1355 // CHECK-LABEL: @test_stream
1356 
1357 // CHECK-LABEL: define available_externally void @_mm_stream_pd
1358 // CHECK: call void asm sideeffect "dcbtstt 0,$0", "b,~{memory}"(double* %{{[0-9a-zA-Z_.]+}})
1359 
1360 // CHECK-LABEL: define available_externally void @_mm_stream_si128
1361 // CHECK: call void asm sideeffect "dcbtstt 0,$0", "b,~{memory}"(<2 x i64>* %{{[0-9a-zA-Z_.]+}})
1362 
1363 // CHECK-LABEL: define available_externally void @_mm_stream_si32
1364 // CHECK: call void asm sideeffect "dcbtstt 0,$0", "b,~{memory}"(i32* %{{[0-9a-zA-Z_.]+}})
1365 
1366 // CHECK-LABEL: define available_externally void @_mm_stream_si64
1367 // CHECK: call void asm sideeffect "\09dcbtstt\090,$0", "b,~{memory}"(i64* %{{[0-9a-zA-Z_.]+}})
1368 
1369 void __attribute__((noinline))
1370 test_sub() {
1371   resi = _mm_sub_epi64(mi1, mi2);
1372   resi = _mm_sub_epi32(mi1, mi2);
1373   resi = _mm_sub_epi16(mi1, mi2);
1374   resi = _mm_sub_epi8(mi1, mi2);
1375   resd = _mm_sub_pd(md1, md2);
1376   resd = _mm_sub_sd(md1, md2);
1377   res64 = _mm_sub_si64(m641, m642);
1378   resi = _mm_subs_epi16(mi1, mi2);
1379   resi = _mm_subs_epi8(mi1, mi2);
1380   resi = _mm_subs_epu16(mi1, mi2);
1381   resi = _mm_subs_epu8(mi1, mi2);
1382 }
1383 
1384 // CHECK-LABEL: @test_sub
1385 
1386 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi64
1387 // CHECK: sub <2 x i64>
1388 
1389 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi32
1390 // CHECK: sub <4 x i32>
1391 
1392 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi16
1393 // CHECK: sub <8 x i16>
1394 
1395 // CHECK-LABEL: define available_externally <2 x i64> @_mm_sub_epi8
1396 // CHECK: sub <16 x i8>
1397 
1398 // CHECK-LABEL: define available_externally <2 x double> @_mm_sub_pd
1399 // CHECK: fsub <2 x double>
1400 
1401 // CHECK-LABEL: define available_externally <2 x double> @_mm_sub_sd
1402 // CHECK: fsub double
1403 
1404 // CHECK-LABEL: define available_externally i64 @_mm_sub_si64
1405 // CHECK: sub i64
1406 
1407 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epi16
1408 // CHECK: call <8 x i16> @vec_subs(short vector[8], short vector[8])
1409 
1410 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epi8
1411 // CHECK: call <16 x i8> @vec_subs(signed char vector[16], signed char vector[16])
1412 
1413 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epu16
1414 // CHECK: call <8 x i16> @vec_subs(unsigned short vector[8], unsigned short vector[8])
1415 
1416 // CHECK-LABEL: define available_externally <2 x i64> @_mm_subs_epu8
1417 // CHECK: call <16 x i8> @vec_subs(unsigned char vector[16], unsigned char vector[16])
1418 
1419 void __attribute__((noinline))
1420 test_ucomi() {
1421   i = _mm_ucomieq_sd(md1, md2);
1422   i = _mm_ucomige_sd(md1, md2);
1423   i = _mm_ucomigt_sd(md1, md2);
1424   i = _mm_ucomile_sd(md1, md2);
1425   i = _mm_ucomilt_sd(md1, md2);
1426   i = _mm_ucomineq_sd(md1, md2);
1427 }
1428 
1429 // CHECK-LABEL: @test_ucomi
1430 
1431 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomieq_sd
1432 // CHECK: fcmp oeq double
1433 
1434 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomige_sd
1435 // CHECK: fcmp oge double
1436 
1437 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomigt_sd
1438 // CHECK: fcmp ogt double
1439 
1440 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomile_sd
1441 // CHECK: fcmp ole double
1442 
1443 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomilt_sd
1444 // CHECK: fcmp olt double
1445 
1446 // CHECK-LABEL: define available_externally signext i32 @_mm_ucomineq_sd
1447 // CHECK: fcmp une double
1448 
1449 void __attribute__((noinline))
1450 test_undefined() {
1451   resd = _mm_undefined_pd();
1452   resi = _mm_undefined_si128();
1453 }
1454 
1455 // CHECK-LABEL: @test_undefined
1456 
1457 // CHECK-LABEL: define available_externally <2 x double> @_mm_undefined_pd()
1458 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x double>, <2 x double>* %[[ADDR:[0-9a-zA-Z_.]+]], align 16
1459 // CHECK: store <2 x double> %[[VAL]], <2 x double>* %[[ADDR]], align 16
1460 // CHECK: load <2 x double>, <2 x double>* %[[ADDR]], align 16
1461 
1462 // CHECK-LABEL: define available_externally <2 x i64> @_mm_undefined_si128()
1463 // CHECK: %[[VAL:[0-9a-zA-Z_.]+]] = load <2 x i64>, <2 x i64>* %[[ADDR:[0-9a-zA-Z_.]+]], align 16
1464 // CHECK: store <2 x i64> %[[VAL]], <2 x i64>* %[[ADDR]], align 16
1465 // CHECK: load <2 x i64>, <2 x i64>* %[[ADDR]], align 16
1466 
1467 void __attribute__((noinline))
1468 test_unpack() {
1469   resi = _mm_unpackhi_epi16(mi1, mi2);
1470   resi = _mm_unpackhi_epi32(mi1, mi2);
1471   resi = _mm_unpackhi_epi64(mi1, mi2);
1472   resi = _mm_unpackhi_epi8(mi1, mi2);
1473   resd = _mm_unpackhi_pd(md1, md2);
1474   resi = _mm_unpacklo_epi16(mi1, mi2);
1475   resi = _mm_unpacklo_epi32(mi1, mi2);
1476   resi = _mm_unpacklo_epi64(mi1, mi2);
1477   resi = _mm_unpacklo_epi8(mi1, mi2);
1478   resd = _mm_unpacklo_pd(md1, md2);
1479 }
1480 
1481 // CHECK-LABEL: @test_unpack
1482 
1483 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi16
1484 // CHECK: call <8 x i16> @vec_mergel(unsigned short vector[8], unsigned short vector[8])
1485 
1486 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi32
1487 // CHECK: call <4 x i32> @vec_mergel(unsigned int vector[4], unsigned int vector[4])
1488 
1489 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi64
1490 // CHECK: call <2 x i64> @vec_mergel(long long vector[2], long long vector[2])
1491 
1492 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpackhi_epi8
1493 // CHECK: call <16 x i8> @vec_mergel(unsigned char vector[16], unsigned char vector[16])
1494 
1495 // CHECK-LABEL: define available_externally <2 x double> @_mm_unpackhi_pd
1496 // CHECK: call <2 x double> @vec_mergel(double vector[2], double vector[2])
1497 
1498 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi16
1499 // CHECK: call <8 x i16> @vec_mergeh(short vector[8], short vector[8])
1500 
1501 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi32
1502 // CHECK: call <4 x i32> @vec_mergeh(int vector[4], int vector[4])
1503 
1504 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi64
1505 // CHECK: call <2 x i64> @vec_mergeh(long long vector[2], long long vector[2])
1506 
1507 // CHECK-LABEL: define available_externally <2 x i64> @_mm_unpacklo_epi8
1508 // CHECK: call <16 x i8> @vec_mergeh(unsigned char vector[16], unsigned char vector[16])
1509 
1510 // CHECK-LABEL: define available_externally <2 x double> @_mm_unpacklo_pd
1511 // CHECK: call <2 x double> @vec_mergeh(double vector[2], double vector[2])
1512