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