blob: ffecb289d5d36931b6e49a72f2c13490d2603bf8 [file] [log] [blame]
Eric Christopherabb2b542016-08-04 06:02:50 +00001// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s
2// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse2 -fno-signed-char -emit-llvm -o - -Wall -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
Sanjay Patel280cfd12016-06-15 21:20:04 +0000186 // CHECK: [[CMP:%.*]] = fcmp oeq <2 x double>
187 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
188 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
189 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000190 return _mm_cmpeq_pd(A, B);
191}
192
193__m128d test_mm_cmpeq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000194 // CHECK-LABEL: test_mm_cmpeq_sd
195 // 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 +0000196 return _mm_cmpeq_sd(A, B);
197}
198
199__m128d test_mm_cmpge_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000200 // CHECK-LABEL: test_mm_cmpge_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000201 // CHECK: [[CMP:%.*]] = fcmp ole <2 x double>
202 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
203 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
204 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000205 return _mm_cmpge_pd(A, B);
206}
207
208__m128d test_mm_cmpge_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000209 // CHECK-LABEL: test_mm_cmpge_sd
210 // 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 +0000211 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
212 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
213 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
214 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000215 return _mm_cmpge_sd(A, B);
216}
217
218__m128i test_mm_cmpgt_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000219 // CHECK-LABEL: test_mm_cmpgt_epi8
220 // CHECK: icmp sgt <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000221 return _mm_cmpgt_epi8(A, B);
222}
223
224__m128i test_mm_cmpgt_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000225 // CHECK-LABEL: test_mm_cmpgt_epi16
226 // CHECK: icmp sgt <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000227 return _mm_cmpgt_epi16(A, B);
228}
229
230__m128i test_mm_cmpgt_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000231 // CHECK-LABEL: test_mm_cmpgt_epi32
232 // CHECK: icmp sgt <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000233 return _mm_cmpgt_epi32(A, B);
234}
235
236__m128d test_mm_cmpgt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000237 // CHECK-LABEL: test_mm_cmpgt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000238 // CHECK: [[CMP:%.*]] = fcmp olt <2 x double>
239 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
240 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
241 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000242 return _mm_cmpgt_pd(A, B);
243}
244
245__m128d test_mm_cmpgt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000246 // CHECK-LABEL: test_mm_cmpgt_sd
247 // 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 +0000248 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
249 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
250 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
251 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000252 return _mm_cmpgt_sd(A, B);
253}
254
255__m128d test_mm_cmple_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000256 // CHECK-LABEL: test_mm_cmple_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000257 // CHECK: [[CMP:%.*]] = fcmp ole <2 x double>
258 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
259 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
260 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000261 return _mm_cmple_pd(A, B);
262}
263
264__m128d test_mm_cmple_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000265 // CHECK-LABEL: test_mm_cmple_sd
266 // 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 +0000267 return _mm_cmple_sd(A, B);
268}
269
270__m128i test_mm_cmplt_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000271 // CHECK-LABEL: test_mm_cmplt_epi8
272 // CHECK: icmp sgt <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000273 return _mm_cmplt_epi8(A, B);
274}
275
276__m128i test_mm_cmplt_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000277 // CHECK-LABEL: test_mm_cmplt_epi16
278 // CHECK: icmp sgt <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000279 return _mm_cmplt_epi16(A, B);
280}
281
282__m128i test_mm_cmplt_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000283 // CHECK-LABEL: test_mm_cmplt_epi32
284 // CHECK: icmp sgt <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000285 return _mm_cmplt_epi32(A, B);
286}
287
288__m128d test_mm_cmplt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000289 // CHECK-LABEL: test_mm_cmplt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000290 // CHECK: [[CMP:%.*]] = fcmp olt <2 x double>
291 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
292 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
293 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000294 return _mm_cmplt_pd(A, B);
295}
296
297__m128d test_mm_cmplt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000298 // CHECK-LABEL: test_mm_cmplt_sd
299 // 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 +0000300 return _mm_cmplt_sd(A, B);
301}
302
303__m128d test_mm_cmpneq_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000304 // CHECK-LABEL: test_mm_cmpneq_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000305 // CHECK: [[CMP:%.*]] = fcmp une <2 x double>
306 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
307 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
308 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000309 return _mm_cmpneq_pd(A, B);
310}
311
312__m128d test_mm_cmpneq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000313 // CHECK-LABEL: test_mm_cmpneq_sd
314 // 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 +0000315 return _mm_cmpneq_sd(A, B);
316}
317
318__m128d test_mm_cmpnge_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000319 // CHECK-LABEL: test_mm_cmpnge_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000320 // CHECK: [[CMP:%.*]] = fcmp ugt <2 x double>
321 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
322 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
323 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000324 return _mm_cmpnge_pd(A, B);
325}
326
327__m128d test_mm_cmpnge_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000328 // CHECK-LABEL: test_mm_cmpnge_sd
329 // 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 +0000330 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
331 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
332 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
333 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000334 return _mm_cmpnge_sd(A, B);
335}
336
337__m128d test_mm_cmpngt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000338 // CHECK-LABEL: test_mm_cmpngt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000339 // CHECK: [[CMP:%.*]] = fcmp uge <2 x double>
340 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
341 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
342 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000343 return _mm_cmpngt_pd(A, B);
344}
345
346__m128d test_mm_cmpngt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000347 // CHECK-LABEL: test_mm_cmpngt_sd
348 // 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 +0000349 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
350 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
351 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
352 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000353 return _mm_cmpngt_sd(A, B);
354}
355
356__m128d test_mm_cmpnle_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000357 // CHECK-LABEL: test_mm_cmpnle_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000358 // CHECK: [[CMP:%.*]] = fcmp ugt <2 x double>
359 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
360 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
361 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000362 return _mm_cmpnle_pd(A, B);
363}
364
365__m128d test_mm_cmpnle_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000366 // CHECK-LABEL: test_mm_cmpnle_sd
367 // 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 +0000368 return _mm_cmpnle_sd(A, B);
369}
370
371__m128d test_mm_cmpnlt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000372 // CHECK-LABEL: test_mm_cmpnlt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000373 // CHECK: [[CMP:%.*]] = fcmp uge <2 x double>
374 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
375 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
376 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000377 return _mm_cmpnlt_pd(A, B);
378}
379
380__m128d test_mm_cmpnlt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000381 // CHECK-LABEL: test_mm_cmpnlt_sd
382 // 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 +0000383 return _mm_cmpnlt_sd(A, B);
384}
385
386__m128d test_mm_cmpord_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000387 // CHECK-LABEL: test_mm_cmpord_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000388 // CHECK: [[CMP:%.*]] = fcmp ord <2 x double>
389 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
390 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
391 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000392 return _mm_cmpord_pd(A, B);
393}
394
395__m128d test_mm_cmpord_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000396 // CHECK-LABEL: test_mm_cmpord_sd
397 // 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 +0000398 return _mm_cmpord_sd(A, B);
399}
400
401__m128d test_mm_cmpunord_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000402 // CHECK-LABEL: test_mm_cmpunord_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000403 // CHECK: [[CMP:%.*]] = fcmp uno <2 x double>
404 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
405 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
406 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000407 return _mm_cmpunord_pd(A, B);
408}
409
410__m128d test_mm_cmpunord_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000411 // CHECK-LABEL: test_mm_cmpunord_sd
412 // 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 +0000413 return _mm_cmpunord_sd(A, B);
414}
415
416int test_mm_comieq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000417 // CHECK-LABEL: test_mm_comieq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000418 // CHECK: call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000419 return _mm_comieq_sd(A, B);
420}
421
422int test_mm_comige_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000423 // CHECK-LABEL: test_mm_comige_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000424 // CHECK: call i32 @llvm.x86.sse2.comige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000425 return _mm_comige_sd(A, B);
426}
427
428int test_mm_comigt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000429 // CHECK-LABEL: test_mm_comigt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000430 // CHECK: call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000431 return _mm_comigt_sd(A, B);
432}
433
434int test_mm_comile_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000435 // CHECK-LABEL: test_mm_comile_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000436 // CHECK: call i32 @llvm.x86.sse2.comile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000437 return _mm_comile_sd(A, B);
438}
439
440int test_mm_comilt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000441 // CHECK-LABEL: test_mm_comilt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000442 // CHECK: call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000443 return _mm_comilt_sd(A, B);
444}
445
446int test_mm_comineq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000447 // CHECK-LABEL: test_mm_comineq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000448 // CHECK: call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000449 return _mm_comineq_sd(A, B);
450}
451
452__m128d test_mm_cvtepi32_pd(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000453 // CHECK-LABEL: test_mm_cvtepi32_pd
Simon Pilgrim90770c72016-05-23 22:13:02 +0000454 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <2 x i32> <i32 0, i32 1>
455 // CHECK: sitofp <2 x i32> %{{.*}} to <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000456 return _mm_cvtepi32_pd(A);
457}
458
459__m128 test_mm_cvtepi32_ps(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000460 // CHECK-LABEL: test_mm_cvtepi32_ps
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000461 // CHECK: call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000462 return _mm_cvtepi32_ps(A);
463}
464
465__m128i test_mm_cvtpd_epi32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000466 // CHECK-LABEL: test_mm_cvtpd_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000467 // CHECK: call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000468 return _mm_cvtpd_epi32(A);
469}
470
471__m128 test_mm_cvtpd_ps(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000472 // CHECK-LABEL: test_mm_cvtpd_ps
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000473 // CHECK: call <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000474 return _mm_cvtpd_ps(A);
475}
476
477__m128i test_mm_cvtps_epi32(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000478 // CHECK-LABEL: test_mm_cvtps_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000479 // CHECK: call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000480 return _mm_cvtps_epi32(A);
481}
482
483__m128d test_mm_cvtps_pd(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000484 // CHECK-LABEL: test_mm_cvtps_pd
Simon Pilgrim90770c72016-05-23 22:13:02 +0000485 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <2 x i32> <i32 0, i32 1>
486 // CHECK: fpext <2 x float> %{{.*}} to <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000487 return _mm_cvtps_pd(A);
488}
489
490double test_mm_cvtsd_f64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000491 // CHECK-LABEL: test_mm_cvtsd_f64
492 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000493 return _mm_cvtsd_f64(A);
494}
495
496int test_mm_cvtsd_si32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000497 // CHECK-LABEL: test_mm_cvtsd_si32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000498 // CHECK: call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000499 return _mm_cvtsd_si32(A);
500}
501
502long long test_mm_cvtsd_si64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000503 // CHECK-LABEL: test_mm_cvtsd_si64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000504 // CHECK: call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000505 return _mm_cvtsd_si64(A);
506}
507
508__m128 test_mm_cvtsd_ss(__m128 A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000509 // CHECK-LABEL: test_mm_cvtsd_ss
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000510 // CHECK: call <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000511 return _mm_cvtsd_ss(A, B);
512}
513
514int test_mm_cvtsi128_si32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000515 // CHECK-LABEL: test_mm_cvtsi128_si32
516 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000517 return _mm_cvtsi128_si32(A);
518}
519
520long long test_mm_cvtsi128_si64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000521 // CHECK-LABEL: test_mm_cvtsi128_si64
522 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000523 return _mm_cvtsi128_si64(A);
524}
525
526__m128d test_mm_cvtsi32_sd(__m128d A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000527 // CHECK-LABEL: test_mm_cvtsi32_sd
528 // CHECK: sitofp i32 %{{.*}} to double
529 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000530 return _mm_cvtsi32_sd(A, B);
531}
532
533__m128i test_mm_cvtsi32_si128(int A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000534 // CHECK-LABEL: test_mm_cvtsi32_si128
535 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000536 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 1
537 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 2
538 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 3
Simon Pilgrima5c04932015-11-29 20:23:00 +0000539 return _mm_cvtsi32_si128(A);
540}
541
542__m128d test_mm_cvtsi64_sd(__m128d A, long long B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000543 // CHECK-LABEL: test_mm_cvtsi64_sd
544 // CHECK: sitofp i64 %{{.*}} to double
545 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000546 return _mm_cvtsi64_sd(A, B);
547}
548
549__m128i test_mm_cvtsi64_si128(long long A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000550 // CHECK-LABEL: test_mm_cvtsi64_si128
551 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000552 // CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000553 return _mm_cvtsi64_si128(A);
554}
555
556__m128d test_mm_cvtss_sd(__m128d A, __m128 B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000557 // CHECK-LABEL: test_mm_cvtss_sd
558 // CHECK: extractelement <4 x float> %{{.*}}, i32 0
559 // CHECK: fpext float %{{.*}} to double
560 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000561 return _mm_cvtss_sd(A, B);
562}
563
564__m128i test_mm_cvttpd_epi32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000565 // CHECK-LABEL: test_mm_cvttpd_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000566 // CHECK: call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000567 return _mm_cvttpd_epi32(A);
568}
569
570__m128i test_mm_cvttps_epi32(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000571 // CHECK-LABEL: test_mm_cvttps_epi32
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000572 // CHECK: call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000573 return _mm_cvttps_epi32(A);
574}
575
576int test_mm_cvttsd_si32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000577 // CHECK-LABEL: test_mm_cvttsd_si32
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000578 // CHECK: call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000579 return _mm_cvttsd_si32(A);
580}
581
582long long test_mm_cvttsd_si64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000583 // CHECK-LABEL: test_mm_cvttsd_si64
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000584 // CHECK: call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000585 return _mm_cvttsd_si64(A);
586}
587
588__m128d test_mm_div_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000589 // CHECK-LABEL: test_mm_div_pd
590 // CHECK: fdiv <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000591 return _mm_div_pd(A, B);
592}
593
594__m128d test_mm_div_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000595 // CHECK-LABEL: test_mm_div_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000596 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
597 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000598 // CHECK: fdiv double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000599 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000600 return _mm_div_sd(A, B);
601}
602
603// Lowering to pextrw requires optimization.
604int test_mm_extract_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000605 // CHECK-LABEL: test_mm_extract_epi16
606 // CHECK: [[x:%.*]] = and i32 %{{.*}}, 7
607 // CHECK: extractelement <8 x i16> %{{.*}}, i32 [[x]]
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000608 // CHECK: zext i16 %{{.*}} to i32
609 return _mm_extract_epi16(A, 9);
Simon Pilgrima5c04932015-11-29 20:23:00 +0000610}
611
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000612__m128i test_mm_insert_epi16(__m128i A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000613 // CHECK-LABEL: test_mm_insert_epi16
614 // CHECK: [[x:%.*]] = and i32 %{{.*}}, 7
615 // CHECK: insertelement <8 x i16> %{{.*}}, i32 [[x]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000616 return _mm_insert_epi16(A, B, 8);
617}
618
619void test_mm_lfence() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000620 // CHECK-LABEL: test_mm_lfence
621 // CHECK: call void @llvm.x86.sse2.lfence()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000622 _mm_lfence();
623}
624
625__m128d test_mm_load_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000626 // CHECK-LABEL: test_mm_load_pd
627 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +0000628 return _mm_load_pd(A);
629}
630
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000631__m128d test_mm_load_pd1(double const* A) {
632 // CHECK-LABEL: test_mm_load_pd1
633 // CHECK: load double, double* %{{.*}}, align 8
634 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
635 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
636 return _mm_load_pd1(A);
637}
638
Simon Pilgrima5c04932015-11-29 20:23:00 +0000639__m128d test_mm_load_sd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000640 // CHECK-LABEL: test_mm_load_sd
Simon Pilgrim0e909362016-05-30 19:20:55 +0000641 // CHECK: load double, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000642 return _mm_load_sd(A);
643}
644
645__m128i test_mm_load_si128(__m128i const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000646 // CHECK-LABEL: test_mm_load_si128
647 // CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +0000648 return _mm_load_si128(A);
649}
650
651__m128d test_mm_load1_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000652 // CHECK-LABEL: test_mm_load1_pd
653 // CHECK: load double, double* %{{.*}}, align 8
654 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
655 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000656 return _mm_load1_pd(A);
657}
658
659__m128d test_mm_loadh_pd(__m128d x, void* y) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000660 // CHECK-LABEL: test_mm_loadh_pd
661 // CHECK: load double, double* %{{.*}}, align 1{{$}}
Simon Pilgrim2d1decf2016-05-17 22:03:31 +0000662 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000663 return _mm_loadh_pd(x, y);
664}
665
Simon Pilgrim2d1decf2016-05-17 22:03:31 +0000666__m128i test_mm_loadl_epi64(__m128i* y) {
667 // CHECK: test_mm_loadl_epi64
668 // CHECK: load i64, i64* {{.*}}, align 1{{$}}
669 // CHECK: insertelement <2 x i64> undef, i64 {{.*}}, i32 0
670 // CHECK: insertelement <2 x i64> {{.*}}, i64 0, i32 1
671 return _mm_loadl_epi64(y);
672}
673
674__m128d test_mm_loadl_pd(__m128d x, void* y) {
675 // CHECK-LABEL: test_mm_loadl_pd
676 // CHECK: load double, double* %{{.*}}, align 1{{$}}
677 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
678 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
679 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
680 return _mm_loadl_pd(x, y);
681}
682
Simon Pilgrima5c04932015-11-29 20:23:00 +0000683__m128d test_mm_loadr_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000684 // CHECK-LABEL: test_mm_loadr_pd
685 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 16
686 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000687 return _mm_loadr_pd(A);
688}
689
690__m128d test_mm_loadu_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000691 // CHECK-LABEL: test_mm_loadu_pd
Simon Pilgrim0e909362016-05-30 19:20:55 +0000692 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000693 return _mm_loadu_pd(A);
694}
695
696__m128i test_mm_loadu_si128(__m128i const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000697 // CHECK-LABEL: test_mm_loadu_si128
Simon Pilgrim0e909362016-05-30 19:20:55 +0000698 // CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000699 return _mm_loadu_si128(A);
700}
701
Simon Pilgrim63500542016-06-29 14:04:08 +0000702__m128i test_mm_loadu_si64(void const* A) {
703 // CHECK-LABEL: test_mm_loadu_si64
704 // CHECK: load i64, i64* %{{.*}}, align 1{{$}}
705 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
706 // CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1
707 return _mm_loadu_si64(A);
708}
709
Simon Pilgrima5c04932015-11-29 20:23:00 +0000710__m128i test_mm_madd_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000711 // CHECK-LABEL: test_mm_madd_epi16
712 // CHECK: call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000713 return _mm_madd_epi16(A, B);
714}
715
716void test_mm_maskmoveu_si128(__m128i A, __m128i B, char* C) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000717 // CHECK-LABEL: test_mm_maskmoveu_si128
718 // CHECK: call void @llvm.x86.sse2.maskmov.dqu(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i8* %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000719 _mm_maskmoveu_si128(A, B, C);
720}
721
722__m128i test_mm_max_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000723 // CHECK-LABEL: test_mm_max_epi16
Sanjay Patel7495ec02016-06-15 17:18:50 +0000724 // CHECK: [[CMP:%.*]] = icmp sgt <8 x i16> [[X:%.*]], [[Y:%.*]]
725 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i16> [[X]], <8 x i16> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000726 return _mm_max_epi16(A, B);
727}
728
729__m128i test_mm_max_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000730 // CHECK-LABEL: test_mm_max_epu8
Sanjay Patel7495ec02016-06-15 17:18:50 +0000731 // CHECK: [[CMP:%.*]] = icmp ugt <16 x i8> [[X:%.*]], [[Y:%.*]]
732 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i8> [[X]], <16 x i8> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000733 return _mm_max_epu8(A, B);
734}
735
736__m128d test_mm_max_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000737 // CHECK-LABEL: test_mm_max_pd
738 // CHECK: call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000739 return _mm_max_pd(A, B);
740}
741
742__m128d test_mm_max_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000743 // CHECK-LABEL: test_mm_max_sd
744 // CHECK: call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000745 return _mm_max_sd(A, B);
746}
747
748void test_mm_mfence() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000749 // CHECK-LABEL: test_mm_mfence
750 // CHECK: call void @llvm.x86.sse2.mfence()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000751 _mm_mfence();
752}
753
754__m128i test_mm_min_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000755 // CHECK-LABEL: test_mm_min_epi16
Sanjay Patel7495ec02016-06-15 17:18:50 +0000756 // CHECK: [[CMP:%.*]] = icmp slt <8 x i16> [[X:%.*]], [[Y:%.*]]
757 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i16> [[X]], <8 x i16> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000758 return _mm_min_epi16(A, B);
759}
760
761__m128i test_mm_min_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000762 // CHECK-LABEL: test_mm_min_epu8
Sanjay Patel7495ec02016-06-15 17:18:50 +0000763 // CHECK: [[CMP:%.*]] = icmp ult <16 x i8> [[X:%.*]], [[Y:%.*]]
764 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i8> [[X]], <16 x i8> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000765 return _mm_min_epu8(A, B);
766}
767
768__m128d test_mm_min_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000769 // CHECK-LABEL: test_mm_min_pd
770 // CHECK: call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000771 return _mm_min_pd(A, B);
772}
773
774__m128d test_mm_min_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000775 // CHECK-LABEL: test_mm_min_sd
776 // CHECK: call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000777 return _mm_min_sd(A, B);
778}
779
Simon Pilgrim97728df2016-05-19 11:18:49 +0000780__m128i test_mm_move_epi64(__m128i A) {
781 // CHECK-LABEL: test_mm_move_epi64
782 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>
783 return _mm_move_epi64(A);
784}
785
786__m128d test_mm_move_sd(__m128d A, __m128d B) {
787 // CHECK-LABEL: test_mm_move_sd
788 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
789 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
790 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
791 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
792 return _mm_move_sd(A, B);
793}
794
Simon Pilgrima5c04932015-11-29 20:23:00 +0000795int test_mm_movemask_epi8(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000796 // CHECK-LABEL: test_mm_movemask_epi8
797 // CHECK: call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000798 return _mm_movemask_epi8(A);
799}
800
801int test_mm_movemask_pd(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000802 // CHECK-LABEL: test_mm_movemask_pd
803 // CHECK: call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000804 return _mm_movemask_pd(A);
805}
806
807__m128i test_mm_mul_epu32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000808 // CHECK-LABEL: test_mm_mul_epu32
809 // CHECK: call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000810 return _mm_mul_epu32(A, B);
811}
812
813__m128d test_mm_mul_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000814 // CHECK-LABEL: test_mm_mul_pd
815 // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000816 return _mm_mul_pd(A, B);
817}
818
819__m128d test_mm_mul_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000820 // CHECK-LABEL: test_mm_mul_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000821 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
822 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
823 // CHECK: fmul double
824 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000825 return _mm_mul_sd(A, B);
826}
827
828__m128i test_mm_mulhi_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000829 // CHECK-LABEL: test_mm_mulhi_epi16
830 // CHECK: call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000831 return _mm_mulhi_epi16(A, B);
832}
833
834__m128i test_mm_mulhi_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000835 // CHECK-LABEL: test_mm_mulhi_epu16
836 // CHECK: call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000837 return _mm_mulhi_epu16(A, B);
838}
839
840__m128i test_mm_mullo_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000841 // CHECK-LABEL: test_mm_mullo_epi16
842 // CHECK: mul <8 x i16> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000843 return _mm_mullo_epi16(A, B);
844}
845
846__m128d test_mm_or_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000847 // CHECK-LABEL: test_mm_or_pd
848 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000849 return _mm_or_pd(A, B);
850}
851
852__m128i test_mm_or_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000853 // CHECK-LABEL: test_mm_or_si128
854 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000855 return _mm_or_si128(A, B);
856}
857
858__m128i test_mm_packs_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000859 // CHECK-LABEL: test_mm_packs_epi16
860 // CHECK: call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000861 return _mm_packs_epi16(A, B);
862}
863
864__m128i test_mm_packs_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000865 // CHECK-LABEL: test_mm_packs_epi32
866 // CHECK: call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000867 return _mm_packs_epi32(A, B);
868}
869
870__m128i test_mm_packus_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000871 // CHECK-LABEL: test_mm_packus_epi16
872 // CHECK: call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000873 return _mm_packus_epi16(A, B);
874}
875
876void test_mm_pause() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000877 // CHECK-LABEL: test_mm_pause
878 // CHECK: call void @llvm.x86.sse2.pause()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000879 return _mm_pause();
880}
881
882__m128i test_mm_sad_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000883 // CHECK-LABEL: test_mm_sad_epu8
884 // CHECK: call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000885 return _mm_sad_epu8(A, B);
886}
887
Simon Pilgrimcddcd2b2016-05-19 11:03:48 +0000888__m128i test_mm_set_epi8(char A, char B, char C, char D,
889 char E, char F, char G, char H,
890 char I, char J, char K, char L,
891 char M, char N, char O, char P) {
892 // CHECK-LABEL: test_mm_set_epi8
893 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
894 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
895 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
896 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
897 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
898 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
899 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
900 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
901 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
902 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
903 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
904 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
905 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
906 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
907 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
908 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
909 return _mm_set_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
910}
911
912__m128i test_mm_set_epi16(short A, short B, short C, short D,
913 short E, short F, short G, short H) {
914 // CHECK-LABEL: test_mm_set_epi16
915 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
916 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
917 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
918 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
919 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
920 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
921 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
922 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
923 return _mm_set_epi16(A, B, C, D, E, F, G, H);
924}
925
926__m128i test_mm_set_epi32(int A, int B, int C, int D) {
927 // CHECK-LABEL: test_mm_set_epi32
928 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
929 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
930 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
931 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
932 return _mm_set_epi32(A, B, C, D);
933}
934
935__m128i test_mm_set_epi64(__m64 A, __m64 B) {
936 // CHECK-LABEL: test_mm_set_epi64
937 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
938 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
939 return _mm_set_epi64(A, B);
940}
941
942__m128i test_mm_set_epi64x(long long A, long long B) {
943 // CHECK-LABEL: test_mm_set_epi64x
944 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
945 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
946 return _mm_set_epi64x(A, B);
947}
948
949__m128d test_mm_set_pd(double A, double B) {
950 // CHECK-LABEL: test_mm_set_pd
951 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
952 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
953 return _mm_set_pd(A, B);
954}
955
956__m128d test_mm_set_sd(double A) {
957 // CHECK-LABEL: test_mm_set_sd
958 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
959 // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 1
960 return _mm_set_sd(A);
961}
962
963__m128i test_mm_set1_epi8(char A) {
964 // CHECK-LABEL: test_mm_set1_epi8
965 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
966 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
967 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
968 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
969 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
970 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
971 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
972 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
973 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
974 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
975 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
976 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
977 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
978 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
979 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
980 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
981 return _mm_set1_epi8(A);
982}
983
984__m128i test_mm_set1_epi16(short A) {
985 // CHECK-LABEL: test_mm_set1_epi16
986 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
987 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
988 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
989 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
990 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
991 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
992 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
993 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
994 return _mm_set1_epi16(A);
995}
996
997__m128i test_mm_set1_epi32(int A) {
998 // CHECK-LABEL: test_mm_set1_epi32
999 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
1000 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
1001 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
1002 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
1003 return _mm_set1_epi32(A);
1004}
1005
1006__m128i test_mm_set1_epi64(__m64 A) {
1007 // CHECK-LABEL: test_mm_set1_epi64
1008 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
1009 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
1010 return _mm_set1_epi64(A);
1011}
1012
1013__m128i test_mm_set1_epi64x(long long A) {
1014 // CHECK-LABEL: test_mm_set1_epi64x
1015 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
1016 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
1017 return _mm_set1_epi64x(A);
1018}
1019
1020__m128d test_mm_set1_pd(double A) {
1021 // CHECK-LABEL: test_mm_set1_pd
1022 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1023 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
1024 return _mm_set1_pd(A);
1025}
1026
1027__m128i test_mm_setr_epi8(char A, char B, char C, char D,
1028 char E, char F, char G, char H,
1029 char I, char J, char K, char L,
1030 char M, char N, char O, char P) {
1031 // CHECK-LABEL: test_mm_setr_epi8
1032 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
1033 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
1034 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
1035 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
1036 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
1037 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
1038 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
1039 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
1040 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
1041 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
1042 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
1043 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
1044 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
1045 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
1046 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
1047 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
1048 return _mm_setr_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
1049}
1050
1051__m128i test_mm_setr_epi16(short A, short B, short C, short D,
1052 short E, short F, short G, short H) {
1053 // CHECK-LABEL: test_mm_setr_epi16
1054 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
1055 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
1056 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
1057 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
1058 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
1059 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
1060 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
1061 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
1062 return _mm_setr_epi16(A, B, C, D, E, F, G, H);
1063}
1064
1065__m128i test_mm_setr_epi32(int A, int B, int C, int D) {
1066 // CHECK-LABEL: test_mm_setr_epi32
1067 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
1068 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
1069 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
1070 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
1071 return _mm_setr_epi32(A, B, C, D);
1072}
1073
1074__m128i test_mm_setr_epi64(__m64 A, __m64 B) {
1075 // CHECK-LABEL: test_mm_setr_epi64
1076 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
1077 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
1078 return _mm_setr_epi64(A, B);
1079}
1080
1081__m128d test_mm_setr_pd(double A, double B) {
1082 // CHECK-LABEL: test_mm_setr_pd
1083 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1084 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
1085 return _mm_setr_pd(A, B);
1086}
1087
Simon Pilgrima5c04932015-11-29 20:23:00 +00001088__m128d test_mm_setzero_pd() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001089 // CHECK-LABEL: test_mm_setzero_pd
1090 // CHECK: store <2 x double> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001091 return _mm_setzero_pd();
1092}
1093
1094__m128i test_mm_setzero_si128() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001095 // CHECK-LABEL: test_mm_setzero_si128
1096 // CHECK: store <2 x i64> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001097 return _mm_setzero_si128();
1098}
1099
1100__m128i test_mm_shuffle_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001101 // CHECK-LABEL: test_mm_shuffle_epi32
1102 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001103 return _mm_shuffle_epi32(A, 0);
1104}
1105
1106__m128d test_mm_shuffle_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001107 // CHECK-LABEL: test_mm_shuffle_pd
1108 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001109 return _mm_shuffle_pd(A, B, 1);
1110}
1111
1112__m128i test_mm_shufflehi_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001113 // CHECK-LABEL: test_mm_shufflehi_epi16
1114 // 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 +00001115 return _mm_shufflehi_epi16(A, 0);
1116}
1117
1118__m128i test_mm_shufflelo_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001119 // CHECK-LABEL: test_mm_shufflelo_epi16
1120 // 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 +00001121 return _mm_shufflelo_epi16(A, 0);
1122}
1123
1124__m128i test_mm_sll_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001125 // CHECK-LABEL: test_mm_sll_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001126 // CHECK: call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001127 return _mm_sll_epi16(A, B);
1128}
1129
1130__m128i test_mm_sll_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001131 // CHECK-LABEL: test_mm_sll_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001132 // CHECK: call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001133 return _mm_sll_epi32(A, B);
1134}
1135
1136__m128i test_mm_sll_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001137 // CHECK-LABEL: test_mm_sll_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001138 // CHECK: call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001139 return _mm_sll_epi64(A, B);
1140}
1141
1142__m128i test_mm_slli_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001143 // CHECK-LABEL: test_mm_slli_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001144 // CHECK: call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001145 return _mm_slli_epi16(A, 1);
1146}
1147
1148__m128i test_mm_slli_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001149 // CHECK-LABEL: test_mm_slli_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001150 // CHECK: call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001151 return _mm_slli_epi32(A, 1);
1152}
1153
1154__m128i test_mm_slli_epi64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001155 // CHECK-LABEL: test_mm_slli_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001156 // CHECK: call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001157 return _mm_slli_epi64(A, 1);
1158}
1159
1160__m128i test_mm_slli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001161 // CHECK-LABEL: test_mm_slli_si128
1162 // 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 +00001163 return _mm_slli_si128(A, 5);
1164}
1165
Craig Topper50e3dfe2016-06-25 07:31:14 +00001166__m128i test_mm_slli_si128_2(__m128i A) {
1167 // CHECK-LABEL: test_mm_slli_si128_2
1168 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1169 return _mm_slli_si128(A, 17);
1170}
1171
Simon Pilgrima5c04932015-11-29 20:23:00 +00001172__m128d test_mm_sqrt_pd(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001173 // CHECK-LABEL: test_mm_sqrt_pd
1174 // CHECK: call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001175 return _mm_sqrt_pd(A);
1176}
1177
1178__m128d test_mm_sqrt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001179 // CHECK-LABEL: test_mm_sqrt_sd
1180 // CHECK: call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %{{.*}})
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001181 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
1182 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1183 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
1184 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +00001185 return _mm_sqrt_sd(A, B);
1186}
1187
1188__m128i test_mm_sra_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001189 // CHECK-LABEL: test_mm_sra_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001190 // CHECK: call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001191 return _mm_sra_epi16(A, B);
1192}
1193
1194__m128i test_mm_sra_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001195 // CHECK-LABEL: test_mm_sra_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001196 // CHECK: call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001197 return _mm_sra_epi32(A, B);
1198}
1199
1200__m128i test_mm_srai_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001201 // CHECK-LABEL: test_mm_srai_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001202 // CHECK: call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001203 return _mm_srai_epi16(A, 1);
1204}
1205
1206__m128i test_mm_srai_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001207 // CHECK-LABEL: test_mm_srai_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001208 // CHECK: call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001209 return _mm_srai_epi32(A, 1);
1210}
1211
1212__m128i test_mm_srl_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001213 // CHECK-LABEL: test_mm_srl_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001214 // CHECK: call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001215 return _mm_srl_epi16(A, B);
1216}
1217
1218__m128i test_mm_srl_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001219 // CHECK-LABEL: test_mm_srl_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001220 // CHECK: call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001221 return _mm_srl_epi32(A, B);
1222}
1223
1224__m128i test_mm_srl_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001225 // CHECK-LABEL: test_mm_srl_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001226 // CHECK: call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001227 return _mm_srl_epi64(A, B);
1228}
1229
1230__m128i test_mm_srli_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001231 // CHECK-LABEL: test_mm_srli_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001232 // CHECK: call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001233 return _mm_srli_epi16(A, 1);
1234}
1235
1236__m128i test_mm_srli_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001237 // CHECK-LABEL: test_mm_srli_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001238 // CHECK: call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001239 return _mm_srli_epi32(A, 1);
1240}
1241
1242__m128i test_mm_srli_epi64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001243 // CHECK-LABEL: test_mm_srli_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001244 // CHECK: call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001245 return _mm_srli_epi64(A, 1);
1246}
1247
1248__m128i test_mm_srli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001249 // CHECK-LABEL: test_mm_srli_si128
1250 // 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 +00001251 return _mm_srli_si128(A, 5);
1252}
1253
Craig Topper50e3dfe2016-06-25 07:31:14 +00001254__m128i test_mm_srli_si128_2(__m128i A) {
1255 // CHECK-LABEL: test_mm_srli_si128_2
1256 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
1257 return _mm_srli_si128(A, 17);
1258}
1259
Simon Pilgrima5c04932015-11-29 20:23:00 +00001260void test_mm_store_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001261 // CHECK-LABEL: test_mm_store_pd
1262 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +00001263 _mm_store_pd(A, B);
1264}
1265
Simon Pilgrim645e1ad2016-05-30 17:55:25 +00001266void test_mm_store_pd1(double* x, __m128d y) {
1267 // CHECK-LABEL: test_mm_store_pd1
1268 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> zeroinitializer
1269 // CHECK: store <2 x double> %{{.*}}, <2 x double>* {{.*}}, align 16
1270 _mm_store_pd1(x, y);
1271}
1272
Simon Pilgrima5c04932015-11-29 20:23:00 +00001273void test_mm_store_sd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001274 // CHECK-LABEL: test_mm_store_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001275 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001276 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001277 _mm_store_sd(A, B);
1278}
1279
1280void test_mm_store_si128(__m128i* A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001281 // CHECK-LABEL: test_mm_store_si128
1282 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +00001283 _mm_store_si128(A, B);
1284}
1285
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001286void test_mm_store1_pd(double* x, __m128d y) {
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001287 // CHECK-LABEL: test_mm_store1_pd
Simon Pilgrim645e1ad2016-05-30 17:55:25 +00001288 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> zeroinitializer
1289 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001290 _mm_store1_pd(x, y);
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001291}
1292
Simon Pilgrima5c04932015-11-29 20:23:00 +00001293void test_mm_storeh_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001294 // CHECK-LABEL: test_mm_storeh_pd
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001295 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
Simon Pilgrim0e909362016-05-30 19:20:55 +00001296 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001297 _mm_storeh_pd(A, B);
1298}
1299
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001300void test_mm_storel_epi64(__m128i x, void* y) {
1301 // CHECK-LABEL: test_mm_storel_epi64
1302 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
1303 // CHECK: store {{.*}} i64* {{.*}}, align 1{{$}}
1304 _mm_storel_epi64(y, x);
1305}
1306
Simon Pilgrima5c04932015-11-29 20:23:00 +00001307void test_mm_storel_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001308 // CHECK-LABEL: test_mm_storel_pd
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001309 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim0e909362016-05-30 19:20:55 +00001310 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001311 _mm_storel_pd(A, B);
1312}
1313
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001314void test_mm_storer_pd(__m128d A, double* B) {
1315 // CHECK-LABEL: test_mm_storer_pd
1316 // CHECK: shufflevector <2 x double> {{.*}}, <2 x double> {{.*}}, <2 x i32> <i32 1, i32 0>
1317 // CHECK: store {{.*}} <2 x double>* {{.*}}, align 16{{$}}
1318 _mm_storer_pd(B, A);
1319}
1320
Simon Pilgrima5c04932015-11-29 20:23:00 +00001321void test_mm_storeu_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001322 // CHECK-LABEL: test_mm_storeu_pd
Craig Topper09175da2016-05-30 17:10:30 +00001323 // CHECK: store {{.*}} <2 x double>* {{.*}}, align 1{{$}}
1324 // CHECK-NEXT: ret void
Simon Pilgrima5c04932015-11-29 20:23:00 +00001325 _mm_storeu_pd(A, B);
1326}
1327
1328void test_mm_storeu_si128(__m128i* A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001329 // CHECK-LABEL: test_mm_storeu_si128
Craig Topper09175da2016-05-30 17:10:30 +00001330 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
1331 // CHECK-NEXT: ret void
Simon Pilgrima5c04932015-11-29 20:23:00 +00001332 _mm_storeu_si128(A, B);
1333}
1334
1335void test_mm_stream_pd(double *A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001336 // CHECK-LABEL: test_mm_stream_pd
1337 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001338 _mm_stream_pd(A, B);
1339}
1340
1341void test_mm_stream_si32(int *A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001342 // CHECK-LABEL: test_mm_stream_si32
1343 // CHECK: store i32 %{{.*}}, i32* %{{.*}}, align 1, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001344 _mm_stream_si32(A, B);
1345}
1346
1347void test_mm_stream_si64(long long *A, long long B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001348 // CHECK-LABEL: test_mm_stream_si64
1349 // CHECK: store i64 %{{.*}}, i64* %{{.*}}, align 1, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001350 _mm_stream_si64(A, B);
1351}
1352
1353void test_mm_stream_si128(__m128i *A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001354 // CHECK-LABEL: test_mm_stream_si128
1355 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001356 _mm_stream_si128(A, B);
1357}
1358
1359__m128i test_mm_sub_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001360 // CHECK-LABEL: test_mm_sub_epi8
1361 // CHECK: sub <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001362 return _mm_sub_epi8(A, B);
1363}
1364
1365__m128i test_mm_sub_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001366 // CHECK-LABEL: test_mm_sub_epi16
1367 // CHECK: sub <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001368 return _mm_sub_epi16(A, B);
1369}
1370
1371__m128i test_mm_sub_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001372 // CHECK-LABEL: test_mm_sub_epi32
1373 // CHECK: sub <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001374 return _mm_sub_epi32(A, B);
1375}
1376
1377__m128i test_mm_sub_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001378 // CHECK-LABEL: test_mm_sub_epi64
1379 // CHECK: sub <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001380 return _mm_sub_epi64(A, B);
1381}
1382
1383__m128d test_mm_sub_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001384 // CHECK-LABEL: test_mm_sub_pd
1385 // CHECK: fsub <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001386 return _mm_sub_pd(A, B);
1387}
1388
1389__m128d test_mm_sub_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001390 // CHECK-LABEL: test_mm_sub_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001391 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
1392 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001393 // CHECK: fsub double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001394 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +00001395 return _mm_sub_sd(A, B);
1396}
1397
1398__m128i test_mm_subs_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001399 // CHECK-LABEL: test_mm_subs_epi8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001400 // CHECK: call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001401 return _mm_subs_epi8(A, B);
1402}
1403
1404__m128i test_mm_subs_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001405 // CHECK-LABEL: test_mm_subs_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001406 // CHECK: call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001407 return _mm_subs_epi16(A, B);
1408}
1409
1410__m128i test_mm_subs_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001411 // CHECK-LABEL: test_mm_subs_epu8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001412 // CHECK: call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001413 return _mm_subs_epu8(A, B);
1414}
1415
1416__m128i test_mm_subs_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001417 // CHECK-LABEL: test_mm_subs_epu16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001418 // CHECK: call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001419 return _mm_subs_epu16(A, B);
1420}
1421
1422int test_mm_ucomieq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001423 // CHECK-LABEL: test_mm_ucomieq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001424 // CHECK: call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001425 return _mm_ucomieq_sd(A, B);
1426}
1427
1428int test_mm_ucomige_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001429 // CHECK-LABEL: test_mm_ucomige_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001430 // CHECK: call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001431 return _mm_ucomige_sd(A, B);
1432}
1433
1434int test_mm_ucomigt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001435 // CHECK-LABEL: test_mm_ucomigt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001436 // CHECK: call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001437 return _mm_ucomigt_sd(A, B);
1438}
1439
1440int test_mm_ucomile_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001441 // CHECK-LABEL: test_mm_ucomile_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001442 // CHECK: call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001443 return _mm_ucomile_sd(A, B);
1444}
1445
1446int test_mm_ucomilt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001447 // CHECK-LABEL: test_mm_ucomilt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001448 // CHECK: call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001449 return _mm_ucomilt_sd(A, B);
1450}
1451
1452int test_mm_ucomineq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001453 // CHECK-LABEL: test_mm_ucomineq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001454 // CHECK: call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001455 return _mm_ucomineq_sd(A, B);
1456}
1457
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001458__m128d test_mm_undefined_pd() {
1459 // CHECK-LABEL: @test_mm_undefined_pd
1460 // CHECK: ret <2 x double> undef
1461 return _mm_undefined_pd();
1462}
1463
1464__m128i test_mm_undefined_si128() {
1465 // CHECK-LABEL: @test_mm_undefined_si128
1466 // CHECK: ret <2 x i64> undef
1467 return _mm_undefined_si128();
1468}
1469
Simon Pilgrima5c04932015-11-29 20:23:00 +00001470__m128i test_mm_unpackhi_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001471 // CHECK-LABEL: test_mm_unpackhi_epi8
1472 // 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 +00001473 return _mm_unpackhi_epi8(A, B);
1474}
1475
1476__m128i test_mm_unpackhi_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001477 // CHECK-LABEL: test_mm_unpackhi_epi16
1478 // 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 +00001479 return _mm_unpackhi_epi16(A, B);
1480}
1481
1482__m128i test_mm_unpackhi_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001483 // CHECK-LABEL: test_mm_unpackhi_epi32
1484 // 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 +00001485 return _mm_unpackhi_epi32(A, B);
1486}
1487
1488__m128i test_mm_unpackhi_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001489 // CHECK-LABEL: test_mm_unpackhi_epi64
1490 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 3>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001491 return _mm_unpackhi_epi64(A, B);
1492}
1493
1494__m128d test_mm_unpackhi_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001495 // CHECK-LABEL: test_mm_unpackhi_pd
1496 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 3>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001497 return _mm_unpackhi_pd(A, B);
1498}
1499
1500__m128i test_mm_unpacklo_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001501 // CHECK-LABEL: test_mm_unpacklo_epi8
1502 // 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 +00001503 return _mm_unpacklo_epi8(A, B);
1504}
1505
1506__m128i test_mm_unpacklo_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001507 // CHECK-LABEL: test_mm_unpacklo_epi16
1508 // 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 +00001509 return _mm_unpacklo_epi16(A, B);
1510}
1511
1512__m128i test_mm_unpacklo_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001513 // CHECK-LABEL: test_mm_unpacklo_epi32
1514 // 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 +00001515 return _mm_unpacklo_epi32(A, B);
1516}
1517
1518__m128i test_mm_unpacklo_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001519 // CHECK-LABEL: test_mm_unpacklo_epi64
1520 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001521 return _mm_unpacklo_epi64(A, B);
1522}
1523
1524__m128d test_mm_unpacklo_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001525 // CHECK-LABEL: test_mm_unpacklo_pd
1526 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001527 return _mm_unpacklo_pd(A, B);
1528}
1529
1530__m128d test_mm_xor_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001531 // CHECK-LABEL: test_mm_xor_pd
1532 // CHECK: xor <4 x i32> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001533 return _mm_xor_pd(A, B);
1534}
1535
1536__m128i test_mm_xor_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001537 // CHECK-LABEL: test_mm_xor_si128
1538 // CHECK: xor <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001539 return _mm_xor_si128(A, B);
1540}