blob: 919c1a629a742fb28430e9cc6aeb9202b846d382 [file] [log] [blame]
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse2 -emit-llvm -o - -Werror | FileCheck %s
2// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s
Simon Pilgrima5c04932015-11-29 20:23:00 +00003
4// Don't include mm_malloc.h, it's system specific.
5#define __MM_MALLOC_H
6
7#include <x86intrin.h>
8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00009// NOTE: This should match the tests in llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll
10
Simon Pilgrima5c04932015-11-29 20:23:00 +000011__m128i test_mm_add_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000012 // CHECK-LABEL: test_mm_add_epi8
13 // CHECK: add <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +000014 return _mm_add_epi8(A, B);
15}
16
17__m128i test_mm_add_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000018 // CHECK-LABEL: test_mm_add_epi16
19 // CHECK: add <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +000020 return _mm_add_epi16(A, B);
21}
22
23__m128i test_mm_add_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000024 // CHECK-LABEL: test_mm_add_epi32
25 // CHECK: add <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +000026 return _mm_add_epi32(A, B);
27}
28
29__m128i test_mm_add_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000030 // CHECK-LABEL: test_mm_add_epi64
31 // CHECK: add <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +000032 return _mm_add_epi64(A, B);
33}
34
35__m128d test_mm_add_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000036 // CHECK-LABEL: test_mm_add_pd
37 // CHECK: fadd <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +000038 return _mm_add_pd(A, B);
39}
40
41__m128d test_mm_add_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000042 // CHECK-LABEL: test_mm_add_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000043 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
44 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000045 // CHECK: fadd double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000046 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +000047 return _mm_add_sd(A, B);
48}
49
50__m128i test_mm_adds_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000051 // CHECK-LABEL: test_mm_adds_epi8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000052 // CHECK: call <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000053 return _mm_adds_epi8(A, B);
54}
55
56__m128i test_mm_adds_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000057 // CHECK-LABEL: test_mm_adds_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000058 // CHECK: call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000059 return _mm_adds_epi16(A, B);
60}
61
62__m128i test_mm_adds_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000063 // CHECK-LABEL: test_mm_adds_epu8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000064 // CHECK: call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000065 return _mm_adds_epu8(A, B);
66}
67
68__m128i test_mm_adds_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000069 // CHECK-LABEL: test_mm_adds_epu16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000070 // CHECK: call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000071 return _mm_adds_epu16(A, B);
72}
73
74__m128d test_mm_and_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000075 // CHECK-LABEL: test_mm_and_pd
76 // CHECK: and <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +000077 return _mm_and_pd(A, B);
78}
79
80__m128i test_mm_and_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000081 // CHECK-LABEL: test_mm_and_si128
82 // CHECK: and <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +000083 return _mm_and_si128(A, B);
84}
85
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000086__m128d test_mm_andnot_pd(__m128d A, __m128d B) {
87 // CHECK-LABEL: test_mm_andnot_pd
88 // CHECK: xor <4 x i32> %{{.*}}, <i32 -1, i32 -1, i32 -1, i32 -1>
89 // CHECK: and <4 x i32>
90 return _mm_andnot_pd(A, B);
91}
92
93__m128i test_mm_andnot_si128(__m128i A, __m128i B) {
94 // CHECK-LABEL: test_mm_andnot_si128
95 // CHECK: xor <2 x i64> %{{.*}}, <i64 -1, i64 -1>
96 // CHECK: and <2 x i64>
97 return _mm_andnot_si128(A, B);
98}
99
Simon Pilgrima5c04932015-11-29 20:23:00 +0000100__m128i test_mm_avg_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000101 // CHECK-LABEL: test_mm_avg_epu8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000102 // CHECK: call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000103 return _mm_avg_epu8(A, B);
104}
105
106__m128i test_mm_avg_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000107 // CHECK-LABEL: test_mm_avg_epu16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000108 // CHECK: call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000109 return _mm_avg_epu16(A, B);
110}
111
112__m128i test_mm_bslli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000113 // CHECK-LABEL: test_mm_bslli_si128
114 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000115 return _mm_bslli_si128(A, 5);
116}
117
118__m128i test_mm_bsrli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000119 // CHECK-LABEL: test_mm_bsrli_si128
120 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000121 return _mm_bsrli_si128(A, 5);
122}
123
Simon Pilgrimcddcd2b2016-05-19 11:03:48 +0000124__m128 test_mm_castpd_ps(__m128d A) {
125 // CHECK-LABEL: test_mm_castpd_ps
126 // CHECK: bitcast <2 x double> %{{.*}} to <4 x float>
127 return _mm_castpd_ps(A);
128}
129
130__m128i test_mm_castpd_si128(__m128d A) {
131 // CHECK-LABEL: test_mm_castpd_si128
132 // CHECK: bitcast <2 x double> %{{.*}} to <2 x i64>
133 return _mm_castpd_si128(A);
134}
135
136__m128d test_mm_castps_pd(__m128 A) {
137 // CHECK-LABEL: test_mm_castps_pd
138 // CHECK: bitcast <4 x float> %{{.*}} to <2 x double>
139 return _mm_castps_pd(A);
140}
141
142__m128i test_mm_castps_si128(__m128 A) {
143 // CHECK-LABEL: test_mm_castps_si128
144 // CHECK: bitcast <4 x float> %{{.*}} to <2 x i64>
145 return _mm_castps_si128(A);
146}
147
148__m128d test_mm_castsi128_pd(__m128i A) {
149 // CHECK-LABEL: test_mm_castsi128_pd
150 // CHECK: bitcast <2 x i64> %{{.*}} to <2 x double>
151 return _mm_castsi128_pd(A);
152}
153
154__m128 test_mm_castsi128_ps(__m128i A) {
155 // CHECK-LABEL: test_mm_castsi128_ps
156 // CHECK: bitcast <2 x i64> %{{.*}} to <4 x float>
157 return _mm_castsi128_ps(A);
158}
159
Simon Pilgrima5c04932015-11-29 20:23:00 +0000160void test_mm_clflush(void* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000161 // CHECK-LABEL: test_mm_clflush
162 // CHECK: call void @llvm.x86.sse2.clflush(i8* %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000163 _mm_clflush(A);
164}
165
166__m128i test_mm_cmpeq_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000167 // CHECK-LABEL: test_mm_cmpeq_epi8
168 // CHECK: icmp eq <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000169 return _mm_cmpeq_epi8(A, B);
170}
171
172__m128i test_mm_cmpeq_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000173 // CHECK-LABEL: test_mm_cmpeq_epi16
174 // CHECK: icmp eq <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000175 return _mm_cmpeq_epi16(A, B);
176}
177
178__m128i test_mm_cmpeq_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000179 // CHECK-LABEL: test_mm_cmpeq_epi32
180 // CHECK: icmp eq <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000181 return _mm_cmpeq_epi32(A, B);
182}
183
184__m128d test_mm_cmpeq_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000185 // CHECK-LABEL: test_mm_cmpeq_pd
186 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 0)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000187 return _mm_cmpeq_pd(A, B);
188}
189
190__m128d test_mm_cmpeq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000191 // CHECK-LABEL: test_mm_cmpeq_sd
192 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 0)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000193 return _mm_cmpeq_sd(A, B);
194}
195
196__m128d test_mm_cmpge_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000197 // CHECK-LABEL: test_mm_cmpge_pd
198 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 2)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000199 return _mm_cmpge_pd(A, B);
200}
201
202__m128d test_mm_cmpge_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000203 // CHECK-LABEL: test_mm_cmpge_sd
204 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 2)
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000205 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
206 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
207 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
208 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000209 return _mm_cmpge_sd(A, B);
210}
211
212__m128i test_mm_cmpgt_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000213 // CHECK-LABEL: test_mm_cmpgt_epi8
214 // CHECK: icmp sgt <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000215 return _mm_cmpgt_epi8(A, B);
216}
217
218__m128i test_mm_cmpgt_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000219 // CHECK-LABEL: test_mm_cmpgt_epi16
220 // CHECK: icmp sgt <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000221 return _mm_cmpgt_epi16(A, B);
222}
223
224__m128i test_mm_cmpgt_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000225 // CHECK-LABEL: test_mm_cmpgt_epi32
226 // CHECK: icmp sgt <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000227 return _mm_cmpgt_epi32(A, B);
228}
229
230__m128d test_mm_cmpgt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000231 // CHECK-LABEL: test_mm_cmpgt_pd
232 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 1)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000233 return _mm_cmpgt_pd(A, B);
234}
235
236__m128d test_mm_cmpgt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000237 // CHECK-LABEL: test_mm_cmpgt_sd
238 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 1)
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000239 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
240 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
241 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
242 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000243 return _mm_cmpgt_sd(A, B);
244}
245
246__m128d test_mm_cmple_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000247 // CHECK-LABEL: test_mm_cmple_pd
248 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 2)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000249 return _mm_cmple_pd(A, B);
250}
251
252__m128d test_mm_cmple_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000253 // CHECK-LABEL: test_mm_cmple_sd
254 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 2)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000255 return _mm_cmple_sd(A, B);
256}
257
258__m128i test_mm_cmplt_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000259 // CHECK-LABEL: test_mm_cmplt_epi8
260 // CHECK: icmp sgt <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000261 return _mm_cmplt_epi8(A, B);
262}
263
264__m128i test_mm_cmplt_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000265 // CHECK-LABEL: test_mm_cmplt_epi16
266 // CHECK: icmp sgt <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000267 return _mm_cmplt_epi16(A, B);
268}
269
270__m128i test_mm_cmplt_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000271 // CHECK-LABEL: test_mm_cmplt_epi32
272 // CHECK: icmp sgt <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000273 return _mm_cmplt_epi32(A, B);
274}
275
276__m128d test_mm_cmplt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000277 // CHECK-LABEL: test_mm_cmplt_pd
278 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 1)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000279 return _mm_cmplt_pd(A, B);
280}
281
282__m128d test_mm_cmplt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000283 // CHECK-LABEL: test_mm_cmplt_sd
284 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 1)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000285 return _mm_cmplt_sd(A, B);
286}
287
288__m128d test_mm_cmpneq_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000289 // CHECK-LABEL: test_mm_cmpneq_pd
290 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 4)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000291 return _mm_cmpneq_pd(A, B);
292}
293
294__m128d test_mm_cmpneq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000295 // CHECK-LABEL: test_mm_cmpneq_sd
296 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 4)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000297 return _mm_cmpneq_sd(A, B);
298}
299
300__m128d test_mm_cmpnge_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000301 // CHECK-LABEL: test_mm_cmpnge_pd
302 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 6)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000303 return _mm_cmpnge_pd(A, B);
304}
305
306__m128d test_mm_cmpnge_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000307 // CHECK-LABEL: test_mm_cmpnge_sd
308 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 6)
Simon Pilgrimbcf88462016-05-19 16:48:59 +0000309 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
310 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
311 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
312 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000313 return _mm_cmpnge_sd(A, B);
314}
315
316__m128d test_mm_cmpngt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000317 // CHECK-LABEL: test_mm_cmpngt_pd
318 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 5)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000319 return _mm_cmpngt_pd(A, B);
320}
321
322__m128d test_mm_cmpngt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000323 // CHECK-LABEL: test_mm_cmpngt_sd
324 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 5)
Simon Pilgrimbcf88462016-05-19 16:48:59 +0000325 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
326 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
327 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
328 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000329 return _mm_cmpngt_sd(A, B);
330}
331
332__m128d test_mm_cmpnle_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000333 // CHECK-LABEL: test_mm_cmpnle_pd
334 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 6)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000335 return _mm_cmpnle_pd(A, B);
336}
337
338__m128d test_mm_cmpnle_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000339 // CHECK-LABEL: test_mm_cmpnle_sd
340 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 6)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000341 return _mm_cmpnle_sd(A, B);
342}
343
344__m128d test_mm_cmpnlt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000345 // CHECK-LABEL: test_mm_cmpnlt_pd
346 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 5)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000347 return _mm_cmpnlt_pd(A, B);
348}
349
350__m128d test_mm_cmpnlt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000351 // CHECK-LABEL: test_mm_cmpnlt_sd
352 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 5)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000353 return _mm_cmpnlt_sd(A, B);
354}
355
356__m128d test_mm_cmpord_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000357 // CHECK-LABEL: test_mm_cmpord_pd
358 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 7)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000359 return _mm_cmpord_pd(A, B);
360}
361
362__m128d test_mm_cmpord_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000363 // CHECK-LABEL: test_mm_cmpord_sd
364 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 7)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000365 return _mm_cmpord_sd(A, B);
366}
367
368__m128d test_mm_cmpunord_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000369 // CHECK-LABEL: test_mm_cmpunord_pd
370 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 3)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000371 return _mm_cmpunord_pd(A, B);
372}
373
374__m128d test_mm_cmpunord_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000375 // CHECK-LABEL: test_mm_cmpunord_sd
376 // CHECK: call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i8 3)
Simon Pilgrima5c04932015-11-29 20:23:00 +0000377 return _mm_cmpunord_sd(A, B);
378}
379
380int test_mm_comieq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000381 // CHECK-LABEL: test_mm_comieq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000382 // CHECK: call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000383 return _mm_comieq_sd(A, B);
384}
385
386int test_mm_comige_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000387 // CHECK-LABEL: test_mm_comige_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000388 // CHECK: call i32 @llvm.x86.sse2.comige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000389 return _mm_comige_sd(A, B);
390}
391
392int test_mm_comigt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000393 // CHECK-LABEL: test_mm_comigt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000394 // CHECK: call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000395 return _mm_comigt_sd(A, B);
396}
397
398int test_mm_comile_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000399 // CHECK-LABEL: test_mm_comile_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000400 // CHECK: call i32 @llvm.x86.sse2.comile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000401 return _mm_comile_sd(A, B);
402}
403
404int test_mm_comilt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000405 // CHECK-LABEL: test_mm_comilt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000406 // CHECK: call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000407 return _mm_comilt_sd(A, B);
408}
409
410int test_mm_comineq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000411 // CHECK-LABEL: test_mm_comineq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000412 // CHECK: call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000413 return _mm_comineq_sd(A, B);
414}
415
416__m128d test_mm_cvtepi32_pd(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000417 // CHECK-LABEL: test_mm_cvtepi32_pd
Simon Pilgrim90770c72016-05-23 22:13:02 +0000418 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <2 x i32> <i32 0, i32 1>
419 // CHECK: sitofp <2 x i32> %{{.*}} to <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000420 return _mm_cvtepi32_pd(A);
421}
422
423__m128 test_mm_cvtepi32_ps(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000424 // CHECK-LABEL: test_mm_cvtepi32_ps
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000425 // CHECK: call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000426 return _mm_cvtepi32_ps(A);
427}
428
429__m128i test_mm_cvtpd_epi32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000430 // CHECK-LABEL: test_mm_cvtpd_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000431 // CHECK: call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000432 return _mm_cvtpd_epi32(A);
433}
434
435__m128 test_mm_cvtpd_ps(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000436 // CHECK-LABEL: test_mm_cvtpd_ps
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000437 // CHECK: call <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000438 return _mm_cvtpd_ps(A);
439}
440
441__m128i test_mm_cvtps_epi32(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000442 // CHECK-LABEL: test_mm_cvtps_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000443 // CHECK: call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000444 return _mm_cvtps_epi32(A);
445}
446
447__m128d test_mm_cvtps_pd(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000448 // CHECK-LABEL: test_mm_cvtps_pd
Simon Pilgrim90770c72016-05-23 22:13:02 +0000449 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <2 x i32> <i32 0, i32 1>
450 // CHECK: fpext <2 x float> %{{.*}} to <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000451 return _mm_cvtps_pd(A);
452}
453
454double test_mm_cvtsd_f64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000455 // CHECK-LABEL: test_mm_cvtsd_f64
456 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000457 return _mm_cvtsd_f64(A);
458}
459
460int test_mm_cvtsd_si32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000461 // CHECK-LABEL: test_mm_cvtsd_si32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000462 // CHECK: call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000463 return _mm_cvtsd_si32(A);
464}
465
466long long test_mm_cvtsd_si64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000467 // CHECK-LABEL: test_mm_cvtsd_si64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000468 // CHECK: call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000469 return _mm_cvtsd_si64(A);
470}
471
472__m128 test_mm_cvtsd_ss(__m128 A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000473 // CHECK-LABEL: test_mm_cvtsd_ss
474 // CHECK: fptrunc double %{{.*}} to float
Simon Pilgrima5c04932015-11-29 20:23:00 +0000475 return _mm_cvtsd_ss(A, B);
476}
477
478int test_mm_cvtsi128_si32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000479 // CHECK-LABEL: test_mm_cvtsi128_si32
480 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000481 return _mm_cvtsi128_si32(A);
482}
483
484long long test_mm_cvtsi128_si64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000485 // CHECK-LABEL: test_mm_cvtsi128_si64
486 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000487 return _mm_cvtsi128_si64(A);
488}
489
490__m128d test_mm_cvtsi32_sd(__m128d A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000491 // CHECK-LABEL: test_mm_cvtsi32_sd
492 // CHECK: sitofp i32 %{{.*}} to double
493 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000494 return _mm_cvtsi32_sd(A, B);
495}
496
497__m128i test_mm_cvtsi32_si128(int A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000498 // CHECK-LABEL: test_mm_cvtsi32_si128
499 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000500 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 1
501 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 2
502 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 3
Simon Pilgrima5c04932015-11-29 20:23:00 +0000503 return _mm_cvtsi32_si128(A);
504}
505
506__m128d test_mm_cvtsi64_sd(__m128d A, long long B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000507 // CHECK-LABEL: test_mm_cvtsi64_sd
508 // CHECK: sitofp i64 %{{.*}} to double
509 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000510 return _mm_cvtsi64_sd(A, B);
511}
512
513__m128i test_mm_cvtsi64_si128(long long A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000514 // CHECK-LABEL: test_mm_cvtsi64_si128
515 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000516 // CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000517 return _mm_cvtsi64_si128(A);
518}
519
520__m128d test_mm_cvtss_sd(__m128d A, __m128 B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000521 // CHECK-LABEL: test_mm_cvtss_sd
522 // CHECK: extractelement <4 x float> %{{.*}}, i32 0
523 // CHECK: fpext float %{{.*}} to double
524 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000525 return _mm_cvtss_sd(A, B);
526}
527
528__m128i test_mm_cvttpd_epi32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000529 // CHECK-LABEL: test_mm_cvttpd_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000530 // CHECK: call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000531 return _mm_cvttpd_epi32(A);
532}
533
534__m128i test_mm_cvttps_epi32(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000535 // CHECK-LABEL: test_mm_cvttps_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000536 // CHECK: call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000537 return _mm_cvttps_epi32(A);
538}
539
540int test_mm_cvttsd_si32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000541 // CHECK-LABEL: test_mm_cvttsd_si32
542 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
543 // CHECK: fptosi double %{{.*}} to i32
Simon Pilgrima5c04932015-11-29 20:23:00 +0000544 return _mm_cvttsd_si32(A);
545}
546
547long long test_mm_cvttsd_si64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000548 // CHECK-LABEL: test_mm_cvttsd_si64
549 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
550 // CHECK: fptosi double %{{.*}} to i64
Simon Pilgrima5c04932015-11-29 20:23:00 +0000551 return _mm_cvttsd_si64(A);
552}
553
554__m128d test_mm_div_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000555 // CHECK-LABEL: test_mm_div_pd
556 // CHECK: fdiv <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000557 return _mm_div_pd(A, B);
558}
559
560__m128d test_mm_div_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000561 // CHECK-LABEL: test_mm_div_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000562 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
563 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000564 // CHECK: fdiv double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000565 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000566 return _mm_div_sd(A, B);
567}
568
569// Lowering to pextrw requires optimization.
570int test_mm_extract_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000571 // CHECK-LABEL: test_mm_extract_epi16
572 // CHECK: [[x:%.*]] = and i32 %{{.*}}, 7
573 // CHECK: extractelement <8 x i16> %{{.*}}, i32 [[x]]
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000574 // CHECK: zext i16 %{{.*}} to i32
575 return _mm_extract_epi16(A, 9);
Simon Pilgrima5c04932015-11-29 20:23:00 +0000576}
577
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000578__m128i test_mm_insert_epi16(__m128i A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000579 // CHECK-LABEL: test_mm_insert_epi16
580 // CHECK: [[x:%.*]] = and i32 %{{.*}}, 7
581 // CHECK: insertelement <8 x i16> %{{.*}}, i32 [[x]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000582 return _mm_insert_epi16(A, B, 8);
583}
584
585void test_mm_lfence() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000586 // CHECK-LABEL: test_mm_lfence
587 // CHECK: call void @llvm.x86.sse2.lfence()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000588 _mm_lfence();
589}
590
591__m128d test_mm_load_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000592 // CHECK-LABEL: test_mm_load_pd
593 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +0000594 return _mm_load_pd(A);
595}
596
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000597__m128d test_mm_load_pd1(double const* A) {
598 // CHECK-LABEL: test_mm_load_pd1
599 // CHECK: load double, double* %{{.*}}, align 8
600 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
601 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
602 return _mm_load_pd1(A);
603}
604
Simon Pilgrima5c04932015-11-29 20:23:00 +0000605__m128d test_mm_load_sd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000606 // CHECK-LABEL: test_mm_load_sd
607 // CHECK: load double, double* %{{.*}}, align 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000608 return _mm_load_sd(A);
609}
610
611__m128i test_mm_load_si128(__m128i const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000612 // CHECK-LABEL: test_mm_load_si128
613 // CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +0000614 return _mm_load_si128(A);
615}
616
617__m128d test_mm_load1_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000618 // CHECK-LABEL: test_mm_load1_pd
619 // CHECK: load double, double* %{{.*}}, align 8
620 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
621 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000622 return _mm_load1_pd(A);
623}
624
625__m128d test_mm_loadh_pd(__m128d x, void* y) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000626 // CHECK-LABEL: test_mm_loadh_pd
627 // CHECK: load double, double* %{{.*}}, align 1{{$}}
Simon Pilgrim2d1decf2016-05-17 22:03:31 +0000628 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000629 return _mm_loadh_pd(x, y);
630}
631
Simon Pilgrim2d1decf2016-05-17 22:03:31 +0000632__m128i test_mm_loadl_epi64(__m128i* y) {
633 // CHECK: test_mm_loadl_epi64
634 // CHECK: load i64, i64* {{.*}}, align 1{{$}}
635 // CHECK: insertelement <2 x i64> undef, i64 {{.*}}, i32 0
636 // CHECK: insertelement <2 x i64> {{.*}}, i64 0, i32 1
637 return _mm_loadl_epi64(y);
638}
639
640__m128d test_mm_loadl_pd(__m128d x, void* y) {
641 // CHECK-LABEL: test_mm_loadl_pd
642 // CHECK: load double, double* %{{.*}}, align 1{{$}}
643 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
644 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
645 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
646 return _mm_loadl_pd(x, y);
647}
648
Simon Pilgrima5c04932015-11-29 20:23:00 +0000649__m128d test_mm_loadr_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000650 // CHECK-LABEL: test_mm_loadr_pd
651 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 16
652 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000653 return _mm_loadr_pd(A);
654}
655
656__m128d test_mm_loadu_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000657 // CHECK-LABEL: test_mm_loadu_pd
658 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000659 return _mm_loadu_pd(A);
660}
661
662__m128i test_mm_loadu_si128(__m128i const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000663 // CHECK-LABEL: test_mm_loadu_si128
664 // CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000665 return _mm_loadu_si128(A);
666}
667
668__m128i test_mm_madd_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000669 // CHECK-LABEL: test_mm_madd_epi16
670 // CHECK: call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000671 return _mm_madd_epi16(A, B);
672}
673
674void test_mm_maskmoveu_si128(__m128i A, __m128i B, char* C) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000675 // CHECK-LABEL: test_mm_maskmoveu_si128
676 // CHECK: call void @llvm.x86.sse2.maskmov.dqu(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i8* %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000677 _mm_maskmoveu_si128(A, B, C);
678}
679
680__m128i test_mm_max_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000681 // CHECK-LABEL: test_mm_max_epi16
682 // CHECK: call <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000683 return _mm_max_epi16(A, B);
684}
685
686__m128i test_mm_max_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000687 // CHECK-LABEL: test_mm_max_epu8
688 // CHECK: call <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000689 return _mm_max_epu8(A, B);
690}
691
692__m128d test_mm_max_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000693 // CHECK-LABEL: test_mm_max_pd
694 // CHECK: call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000695 return _mm_max_pd(A, B);
696}
697
698__m128d test_mm_max_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000699 // CHECK-LABEL: test_mm_max_sd
700 // CHECK: call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000701 return _mm_max_sd(A, B);
702}
703
704void test_mm_mfence() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000705 // CHECK-LABEL: test_mm_mfence
706 // CHECK: call void @llvm.x86.sse2.mfence()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000707 _mm_mfence();
708}
709
710__m128i test_mm_min_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000711 // CHECK-LABEL: test_mm_min_epi16
712 // CHECK: call <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000713 return _mm_min_epi16(A, B);
714}
715
716__m128i test_mm_min_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000717 // CHECK-LABEL: test_mm_min_epu8
718 // CHECK: call <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000719 return _mm_min_epu8(A, B);
720}
721
722__m128d test_mm_min_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000723 // CHECK-LABEL: test_mm_min_pd
724 // CHECK: call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000725 return _mm_min_pd(A, B);
726}
727
728__m128d test_mm_min_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000729 // CHECK-LABEL: test_mm_min_sd
730 // CHECK: call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000731 return _mm_min_sd(A, B);
732}
733
Simon Pilgrim97728df2016-05-19 11:18:49 +0000734__m128i test_mm_move_epi64(__m128i A) {
735 // CHECK-LABEL: test_mm_move_epi64
736 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>
737 return _mm_move_epi64(A);
738}
739
740__m128d test_mm_move_sd(__m128d A, __m128d B) {
741 // CHECK-LABEL: test_mm_move_sd
742 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
743 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
744 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
745 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
746 return _mm_move_sd(A, B);
747}
748
Simon Pilgrima5c04932015-11-29 20:23:00 +0000749int test_mm_movemask_epi8(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000750 // CHECK-LABEL: test_mm_movemask_epi8
751 // CHECK: call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000752 return _mm_movemask_epi8(A);
753}
754
755int test_mm_movemask_pd(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000756 // CHECK-LABEL: test_mm_movemask_pd
757 // CHECK: call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000758 return _mm_movemask_pd(A);
759}
760
761__m128i test_mm_mul_epu32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000762 // CHECK-LABEL: test_mm_mul_epu32
763 // CHECK: call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000764 return _mm_mul_epu32(A, B);
765}
766
767__m128d test_mm_mul_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000768 // CHECK-LABEL: test_mm_mul_pd
769 // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000770 return _mm_mul_pd(A, B);
771}
772
773__m128d test_mm_mul_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000774 // CHECK-LABEL: test_mm_mul_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000775 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
776 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
777 // CHECK: fmul double
778 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000779 return _mm_mul_sd(A, B);
780}
781
782__m128i test_mm_mulhi_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000783 // CHECK-LABEL: test_mm_mulhi_epi16
784 // CHECK: call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000785 return _mm_mulhi_epi16(A, B);
786}
787
788__m128i test_mm_mulhi_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000789 // CHECK-LABEL: test_mm_mulhi_epu16
790 // CHECK: call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000791 return _mm_mulhi_epu16(A, B);
792}
793
794__m128i test_mm_mullo_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000795 // CHECK-LABEL: test_mm_mullo_epi16
796 // CHECK: mul <8 x i16> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000797 return _mm_mullo_epi16(A, B);
798}
799
800__m128d test_mm_or_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000801 // CHECK-LABEL: test_mm_or_pd
802 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000803 return _mm_or_pd(A, B);
804}
805
806__m128i test_mm_or_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000807 // CHECK-LABEL: test_mm_or_si128
808 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000809 return _mm_or_si128(A, B);
810}
811
812__m128i test_mm_packs_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000813 // CHECK-LABEL: test_mm_packs_epi16
814 // CHECK: call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000815 return _mm_packs_epi16(A, B);
816}
817
818__m128i test_mm_packs_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000819 // CHECK-LABEL: test_mm_packs_epi32
820 // CHECK: call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000821 return _mm_packs_epi32(A, B);
822}
823
824__m128i test_mm_packus_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000825 // CHECK-LABEL: test_mm_packus_epi16
826 // CHECK: call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000827 return _mm_packus_epi16(A, B);
828}
829
830void test_mm_pause() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000831 // CHECK-LABEL: test_mm_pause
832 // CHECK: call void @llvm.x86.sse2.pause()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000833 return _mm_pause();
834}
835
836__m128i test_mm_sad_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000837 // CHECK-LABEL: test_mm_sad_epu8
838 // CHECK: call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000839 return _mm_sad_epu8(A, B);
840}
841
Simon Pilgrimcddcd2b2016-05-19 11:03:48 +0000842__m128i test_mm_set_epi8(char A, char B, char C, char D,
843 char E, char F, char G, char H,
844 char I, char J, char K, char L,
845 char M, char N, char O, char P) {
846 // CHECK-LABEL: test_mm_set_epi8
847 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
848 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
849 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
850 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
851 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
852 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
853 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
854 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
855 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
856 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
857 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
858 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
859 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
860 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
861 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
862 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
863 return _mm_set_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
864}
865
866__m128i test_mm_set_epi16(short A, short B, short C, short D,
867 short E, short F, short G, short H) {
868 // CHECK-LABEL: test_mm_set_epi16
869 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
870 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
871 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
872 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
873 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
874 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
875 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
876 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
877 return _mm_set_epi16(A, B, C, D, E, F, G, H);
878}
879
880__m128i test_mm_set_epi32(int A, int B, int C, int D) {
881 // CHECK-LABEL: test_mm_set_epi32
882 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
883 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
884 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
885 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
886 return _mm_set_epi32(A, B, C, D);
887}
888
889__m128i test_mm_set_epi64(__m64 A, __m64 B) {
890 // CHECK-LABEL: test_mm_set_epi64
891 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
892 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
893 return _mm_set_epi64(A, B);
894}
895
896__m128i test_mm_set_epi64x(long long A, long long B) {
897 // CHECK-LABEL: test_mm_set_epi64x
898 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
899 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
900 return _mm_set_epi64x(A, B);
901}
902
903__m128d test_mm_set_pd(double A, double B) {
904 // CHECK-LABEL: test_mm_set_pd
905 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
906 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
907 return _mm_set_pd(A, B);
908}
909
910__m128d test_mm_set_sd(double A) {
911 // CHECK-LABEL: test_mm_set_sd
912 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
913 // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 1
914 return _mm_set_sd(A);
915}
916
917__m128i test_mm_set1_epi8(char A) {
918 // CHECK-LABEL: test_mm_set1_epi8
919 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
920 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
921 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
922 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
923 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
924 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
925 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
926 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
927 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
928 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
929 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
930 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
931 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
932 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
933 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
934 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
935 return _mm_set1_epi8(A);
936}
937
938__m128i test_mm_set1_epi16(short A) {
939 // CHECK-LABEL: test_mm_set1_epi16
940 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
941 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
942 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
943 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
944 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
945 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
946 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
947 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
948 return _mm_set1_epi16(A);
949}
950
951__m128i test_mm_set1_epi32(int A) {
952 // CHECK-LABEL: test_mm_set1_epi32
953 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
954 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
955 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
956 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
957 return _mm_set1_epi32(A);
958}
959
960__m128i test_mm_set1_epi64(__m64 A) {
961 // CHECK-LABEL: test_mm_set1_epi64
962 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
963 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
964 return _mm_set1_epi64(A);
965}
966
967__m128i test_mm_set1_epi64x(long long A) {
968 // CHECK-LABEL: test_mm_set1_epi64x
969 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
970 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
971 return _mm_set1_epi64x(A);
972}
973
974__m128d test_mm_set1_pd(double A) {
975 // CHECK-LABEL: test_mm_set1_pd
976 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
977 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
978 return _mm_set1_pd(A);
979}
980
981__m128i test_mm_setr_epi8(char A, char B, char C, char D,
982 char E, char F, char G, char H,
983 char I, char J, char K, char L,
984 char M, char N, char O, char P) {
985 // CHECK-LABEL: test_mm_setr_epi8
986 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
987 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
988 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
989 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
990 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
991 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
992 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
993 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
994 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
995 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
996 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
997 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
998 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
999 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
1000 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
1001 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
1002 return _mm_setr_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
1003}
1004
1005__m128i test_mm_setr_epi16(short A, short B, short C, short D,
1006 short E, short F, short G, short H) {
1007 // CHECK-LABEL: test_mm_setr_epi16
1008 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
1009 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
1010 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
1011 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
1012 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
1013 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
1014 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
1015 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
1016 return _mm_setr_epi16(A, B, C, D, E, F, G, H);
1017}
1018
1019__m128i test_mm_setr_epi32(int A, int B, int C, int D) {
1020 // CHECK-LABEL: test_mm_setr_epi32
1021 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
1022 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
1023 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
1024 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
1025 return _mm_setr_epi32(A, B, C, D);
1026}
1027
1028__m128i test_mm_setr_epi64(__m64 A, __m64 B) {
1029 // CHECK-LABEL: test_mm_setr_epi64
1030 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
1031 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
1032 return _mm_setr_epi64(A, B);
1033}
1034
1035__m128d test_mm_setr_pd(double A, double B) {
1036 // CHECK-LABEL: test_mm_setr_pd
1037 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1038 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
1039 return _mm_setr_pd(A, B);
1040}
1041
Simon Pilgrima5c04932015-11-29 20:23:00 +00001042__m128d test_mm_setzero_pd() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001043 // CHECK-LABEL: test_mm_setzero_pd
1044 // CHECK: store <2 x double> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001045 return _mm_setzero_pd();
1046}
1047
1048__m128i test_mm_setzero_si128() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001049 // CHECK-LABEL: test_mm_setzero_si128
1050 // CHECK: store <2 x i64> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001051 return _mm_setzero_si128();
1052}
1053
1054__m128i test_mm_shuffle_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001055 // CHECK-LABEL: test_mm_shuffle_epi32
1056 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001057 return _mm_shuffle_epi32(A, 0);
1058}
1059
1060__m128d test_mm_shuffle_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001061 // CHECK-LABEL: test_mm_shuffle_pd
1062 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001063 return _mm_shuffle_pd(A, B, 1);
1064}
1065
1066__m128i test_mm_shufflehi_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001067 // CHECK-LABEL: test_mm_shufflehi_epi16
1068 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001069 return _mm_shufflehi_epi16(A, 0);
1070}
1071
1072__m128i test_mm_shufflelo_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001073 // CHECK-LABEL: test_mm_shufflelo_epi16
1074 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 4, i32 5, i32 6, i32 7>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001075 return _mm_shufflelo_epi16(A, 0);
1076}
1077
1078__m128i test_mm_sll_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001079 // CHECK-LABEL: test_mm_sll_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001080 // CHECK: call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001081 return _mm_sll_epi16(A, B);
1082}
1083
1084__m128i test_mm_sll_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001085 // CHECK-LABEL: test_mm_sll_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001086 // CHECK: call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001087 return _mm_sll_epi32(A, B);
1088}
1089
1090__m128i test_mm_sll_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001091 // CHECK-LABEL: test_mm_sll_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001092 // CHECK: call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001093 return _mm_sll_epi64(A, B);
1094}
1095
1096__m128i test_mm_slli_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001097 // CHECK-LABEL: test_mm_slli_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001098 // CHECK: call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001099 return _mm_slli_epi16(A, 1);
1100}
1101
1102__m128i test_mm_slli_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001103 // CHECK-LABEL: test_mm_slli_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001104 // CHECK: call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001105 return _mm_slli_epi32(A, 1);
1106}
1107
1108__m128i test_mm_slli_epi64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001109 // CHECK-LABEL: test_mm_slli_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001110 // CHECK: call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001111 return _mm_slli_epi64(A, 1);
1112}
1113
1114__m128i test_mm_slli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001115 // CHECK-LABEL: test_mm_slli_si128
1116 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001117 return _mm_slli_si128(A, 5);
1118}
1119
1120__m128d test_mm_sqrt_pd(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001121 // CHECK-LABEL: test_mm_sqrt_pd
1122 // CHECK: call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001123 return _mm_sqrt_pd(A);
1124}
1125
1126__m128d test_mm_sqrt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001127 // CHECK-LABEL: test_mm_sqrt_sd
1128 // CHECK: call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %{{.*}})
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001129 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
1130 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1131 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
1132 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +00001133 return _mm_sqrt_sd(A, B);
1134}
1135
1136__m128i test_mm_sra_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001137 // CHECK-LABEL: test_mm_sra_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001138 // CHECK: call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001139 return _mm_sra_epi16(A, B);
1140}
1141
1142__m128i test_mm_sra_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001143 // CHECK-LABEL: test_mm_sra_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001144 // CHECK: call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001145 return _mm_sra_epi32(A, B);
1146}
1147
1148__m128i test_mm_srai_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001149 // CHECK-LABEL: test_mm_srai_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001150 // CHECK: call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001151 return _mm_srai_epi16(A, 1);
1152}
1153
1154__m128i test_mm_srai_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001155 // CHECK-LABEL: test_mm_srai_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001156 // CHECK: call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001157 return _mm_srai_epi32(A, 1);
1158}
1159
1160__m128i test_mm_srl_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001161 // CHECK-LABEL: test_mm_srl_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001162 // CHECK: call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001163 return _mm_srl_epi16(A, B);
1164}
1165
1166__m128i test_mm_srl_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001167 // CHECK-LABEL: test_mm_srl_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001168 // CHECK: call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001169 return _mm_srl_epi32(A, B);
1170}
1171
1172__m128i test_mm_srl_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001173 // CHECK-LABEL: test_mm_srl_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001174 // CHECK: call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001175 return _mm_srl_epi64(A, B);
1176}
1177
1178__m128i test_mm_srli_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001179 // CHECK-LABEL: test_mm_srli_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001180 // CHECK: call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001181 return _mm_srli_epi16(A, 1);
1182}
1183
1184__m128i test_mm_srli_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001185 // CHECK-LABEL: test_mm_srli_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001186 // CHECK: call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001187 return _mm_srli_epi32(A, 1);
1188}
1189
1190__m128i test_mm_srli_epi64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001191 // CHECK-LABEL: test_mm_srli_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001192 // CHECK: call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001193 return _mm_srli_epi64(A, 1);
1194}
1195
1196__m128i test_mm_srli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001197 // CHECK-LABEL: test_mm_srli_si128
1198 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001199 return _mm_srli_si128(A, 5);
1200}
1201
1202void test_mm_store_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001203 // CHECK-LABEL: test_mm_store_pd
1204 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +00001205 _mm_store_pd(A, B);
1206}
1207
1208void test_mm_store_sd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001209 // CHECK-LABEL: test_mm_store_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001210 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001211 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001212 _mm_store_sd(A, B);
1213}
1214
1215void test_mm_store_si128(__m128i* A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001216 // CHECK-LABEL: test_mm_store_si128
1217 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +00001218 _mm_store_si128(A, B);
1219}
1220
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001221void test_mm_store1_pd(double* x, __m128d y) {
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001222 // CHECK-LABEL: test_mm_store1_pd
1223 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
1224 // CHECK: store {{.*}} double* {{.*}}, align 1{{$}}
1225 // CHECK: store {{.*}} double* {{.*}}, align 1{{$}}
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001226 _mm_store1_pd(x, y);
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001227}
1228
Simon Pilgrima5c04932015-11-29 20:23:00 +00001229void test_mm_storeh_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001230 // CHECK-LABEL: test_mm_storeh_pd
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001231 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001232 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1
Simon Pilgrima5c04932015-11-29 20:23:00 +00001233 _mm_storeh_pd(A, B);
1234}
1235
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001236void test_mm_storel_epi64(__m128i x, void* y) {
1237 // CHECK-LABEL: test_mm_storel_epi64
1238 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
1239 // CHECK: store {{.*}} i64* {{.*}}, align 1{{$}}
1240 _mm_storel_epi64(y, x);
1241}
1242
Simon Pilgrima5c04932015-11-29 20:23:00 +00001243void test_mm_storel_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001244 // CHECK-LABEL: test_mm_storel_pd
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001245 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001246 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1
Simon Pilgrima5c04932015-11-29 20:23:00 +00001247 _mm_storel_pd(A, B);
1248}
1249
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001250void test_mm_storer_pd(__m128d A, double* B) {
1251 // CHECK-LABEL: test_mm_storer_pd
1252 // CHECK: shufflevector <2 x double> {{.*}}, <2 x double> {{.*}}, <2 x i32> <i32 1, i32 0>
1253 // CHECK: store {{.*}} <2 x double>* {{.*}}, align 16{{$}}
1254 _mm_storer_pd(B, A);
1255}
1256
Simon Pilgrima5c04932015-11-29 20:23:00 +00001257void test_mm_storeu_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001258 // CHECK-LABEL: test_mm_storeu_pd
Craig Topperf70a61f2016-05-25 05:26:23 +00001259 // CHECK: call void @llvm.x86.sse2.storeu.pd(i8* %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001260 _mm_storeu_pd(A, B);
1261}
1262
1263void test_mm_storeu_si128(__m128i* A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001264 // CHECK-LABEL: test_mm_storeu_si128
Craig Topperf70a61f2016-05-25 05:26:23 +00001265 // CHECK: call void @llvm.x86.sse2.storeu.dq(i8* %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001266 _mm_storeu_si128(A, B);
1267}
1268
1269void test_mm_stream_pd(double *A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001270 // CHECK-LABEL: test_mm_stream_pd
1271 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001272 _mm_stream_pd(A, B);
1273}
1274
1275void test_mm_stream_si32(int *A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001276 // CHECK-LABEL: test_mm_stream_si32
1277 // CHECK: store i32 %{{.*}}, i32* %{{.*}}, align 1, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001278 _mm_stream_si32(A, B);
1279}
1280
1281void test_mm_stream_si64(long long *A, long long B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001282 // CHECK-LABEL: test_mm_stream_si64
1283 // CHECK: store i64 %{{.*}}, i64* %{{.*}}, align 1, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001284 _mm_stream_si64(A, B);
1285}
1286
1287void test_mm_stream_si128(__m128i *A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001288 // CHECK-LABEL: test_mm_stream_si128
1289 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001290 _mm_stream_si128(A, B);
1291}
1292
1293__m128i test_mm_sub_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001294 // CHECK-LABEL: test_mm_sub_epi8
1295 // CHECK: sub <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001296 return _mm_sub_epi8(A, B);
1297}
1298
1299__m128i test_mm_sub_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001300 // CHECK-LABEL: test_mm_sub_epi16
1301 // CHECK: sub <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001302 return _mm_sub_epi16(A, B);
1303}
1304
1305__m128i test_mm_sub_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001306 // CHECK-LABEL: test_mm_sub_epi32
1307 // CHECK: sub <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001308 return _mm_sub_epi32(A, B);
1309}
1310
1311__m128i test_mm_sub_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001312 // CHECK-LABEL: test_mm_sub_epi64
1313 // CHECK: sub <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001314 return _mm_sub_epi64(A, B);
1315}
1316
1317__m128d test_mm_sub_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001318 // CHECK-LABEL: test_mm_sub_pd
1319 // CHECK: fsub <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001320 return _mm_sub_pd(A, B);
1321}
1322
1323__m128d test_mm_sub_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001324 // CHECK-LABEL: test_mm_sub_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001325 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
1326 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001327 // CHECK: fsub double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001328 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +00001329 return _mm_sub_sd(A, B);
1330}
1331
1332__m128i test_mm_subs_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001333 // CHECK-LABEL: test_mm_subs_epi8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001334 // CHECK: call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001335 return _mm_subs_epi8(A, B);
1336}
1337
1338__m128i test_mm_subs_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001339 // CHECK-LABEL: test_mm_subs_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001340 // CHECK: call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001341 return _mm_subs_epi16(A, B);
1342}
1343
1344__m128i test_mm_subs_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001345 // CHECK-LABEL: test_mm_subs_epu8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001346 // CHECK: call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001347 return _mm_subs_epu8(A, B);
1348}
1349
1350__m128i test_mm_subs_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001351 // CHECK-LABEL: test_mm_subs_epu16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001352 // CHECK: call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001353 return _mm_subs_epu16(A, B);
1354}
1355
1356int test_mm_ucomieq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001357 // CHECK-LABEL: test_mm_ucomieq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001358 // CHECK: call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001359 return _mm_ucomieq_sd(A, B);
1360}
1361
1362int test_mm_ucomige_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001363 // CHECK-LABEL: test_mm_ucomige_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001364 // CHECK: call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001365 return _mm_ucomige_sd(A, B);
1366}
1367
1368int test_mm_ucomigt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001369 // CHECK-LABEL: test_mm_ucomigt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001370 // CHECK: call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001371 return _mm_ucomigt_sd(A, B);
1372}
1373
1374int test_mm_ucomile_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001375 // CHECK-LABEL: test_mm_ucomile_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001376 // CHECK: call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001377 return _mm_ucomile_sd(A, B);
1378}
1379
1380int test_mm_ucomilt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001381 // CHECK-LABEL: test_mm_ucomilt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001382 // CHECK: call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001383 return _mm_ucomilt_sd(A, B);
1384}
1385
1386int test_mm_ucomineq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001387 // CHECK-LABEL: test_mm_ucomineq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001388 // CHECK: call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001389 return _mm_ucomineq_sd(A, B);
1390}
1391
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001392__m128d test_mm_undefined_pd() {
1393 // CHECK-LABEL: @test_mm_undefined_pd
1394 // CHECK: ret <2 x double> undef
1395 return _mm_undefined_pd();
1396}
1397
1398__m128i test_mm_undefined_si128() {
1399 // CHECK-LABEL: @test_mm_undefined_si128
1400 // CHECK: ret <2 x i64> undef
1401 return _mm_undefined_si128();
1402}
1403
Simon Pilgrima5c04932015-11-29 20:23:00 +00001404__m128i test_mm_unpackhi_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001405 // CHECK-LABEL: test_mm_unpackhi_epi8
1406 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001407 return _mm_unpackhi_epi8(A, B);
1408}
1409
1410__m128i test_mm_unpackhi_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001411 // CHECK-LABEL: test_mm_unpackhi_epi16
1412 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001413 return _mm_unpackhi_epi16(A, B);
1414}
1415
1416__m128i test_mm_unpackhi_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001417 // CHECK-LABEL: test_mm_unpackhi_epi32
1418 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001419 return _mm_unpackhi_epi32(A, B);
1420}
1421
1422__m128i test_mm_unpackhi_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001423 // CHECK-LABEL: test_mm_unpackhi_epi64
1424 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 3>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001425 return _mm_unpackhi_epi64(A, B);
1426}
1427
1428__m128d test_mm_unpackhi_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001429 // CHECK-LABEL: test_mm_unpackhi_pd
1430 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 3>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001431 return _mm_unpackhi_pd(A, B);
1432}
1433
1434__m128i test_mm_unpacklo_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001435 // CHECK-LABEL: test_mm_unpacklo_epi8
1436 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001437 return _mm_unpacklo_epi8(A, B);
1438}
1439
1440__m128i test_mm_unpacklo_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001441 // CHECK-LABEL: test_mm_unpacklo_epi16
1442 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001443 return _mm_unpacklo_epi16(A, B);
1444}
1445
1446__m128i test_mm_unpacklo_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001447 // CHECK-LABEL: test_mm_unpacklo_epi32
1448 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001449 return _mm_unpacklo_epi32(A, B);
1450}
1451
1452__m128i test_mm_unpacklo_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001453 // CHECK-LABEL: test_mm_unpacklo_epi64
1454 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001455 return _mm_unpacklo_epi64(A, B);
1456}
1457
1458__m128d test_mm_unpacklo_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001459 // CHECK-LABEL: test_mm_unpacklo_pd
1460 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001461 return _mm_unpacklo_pd(A, B);
1462}
1463
1464__m128d test_mm_xor_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001465 // CHECK-LABEL: test_mm_xor_pd
1466 // CHECK: xor <4 x i32> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001467 return _mm_xor_pd(A, B);
1468}
1469
1470__m128i test_mm_xor_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001471 // CHECK-LABEL: test_mm_xor_si128
1472 // CHECK: xor <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001473 return _mm_xor_si128(A, B);
1474}