blob: 48c703685479f4bfcee23b8d08b9591440459055 [file] [log] [blame]
Elad Cohenb107a222016-09-28 11:59:09 +00001// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse2 -emit-llvm -o - -Wall -Werror | FileCheck %s
2// RUN: %clang_cc1 -ffreestanding %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
Simon Pilgrima5c04932015-11-29 20:23:00 +00004
5#include <x86intrin.h>
6
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00007// NOTE: This should match the tests in llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll
8
Simon Pilgrima5c04932015-11-29 20:23:00 +00009__m128i test_mm_add_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000010 // CHECK-LABEL: test_mm_add_epi8
11 // CHECK: add <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +000012 return _mm_add_epi8(A, B);
13}
14
15__m128i test_mm_add_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000016 // CHECK-LABEL: test_mm_add_epi16
17 // CHECK: add <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +000018 return _mm_add_epi16(A, B);
19}
20
21__m128i test_mm_add_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000022 // CHECK-LABEL: test_mm_add_epi32
23 // CHECK: add <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +000024 return _mm_add_epi32(A, B);
25}
26
27__m128i test_mm_add_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000028 // CHECK-LABEL: test_mm_add_epi64
29 // CHECK: add <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +000030 return _mm_add_epi64(A, B);
31}
32
33__m128d test_mm_add_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000034 // CHECK-LABEL: test_mm_add_pd
35 // CHECK: fadd <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +000036 return _mm_add_pd(A, B);
37}
38
39__m128d test_mm_add_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000040 // CHECK-LABEL: test_mm_add_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000041 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
42 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000043 // CHECK: fadd double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000044 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +000045 return _mm_add_sd(A, B);
46}
47
48__m128i test_mm_adds_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000049 // CHECK-LABEL: test_mm_adds_epi8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000050 // CHECK: call <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000051 return _mm_adds_epi8(A, B);
52}
53
54__m128i test_mm_adds_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000055 // CHECK-LABEL: test_mm_adds_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000056 // CHECK: call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000057 return _mm_adds_epi16(A, B);
58}
59
60__m128i test_mm_adds_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000061 // CHECK-LABEL: test_mm_adds_epu8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000062 // CHECK: call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000063 return _mm_adds_epu8(A, B);
64}
65
66__m128i test_mm_adds_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000067 // CHECK-LABEL: test_mm_adds_epu16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000068 // CHECK: call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +000069 return _mm_adds_epu16(A, B);
70}
71
72__m128d test_mm_and_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000073 // CHECK-LABEL: test_mm_and_pd
Craig Topperd0681d52016-08-31 05:38:55 +000074 // CHECK: and <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +000075 return _mm_and_pd(A, B);
76}
77
78__m128i test_mm_and_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000079 // CHECK-LABEL: test_mm_and_si128
80 // CHECK: and <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +000081 return _mm_and_si128(A, B);
82}
83
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000084__m128d test_mm_andnot_pd(__m128d A, __m128d B) {
85 // CHECK-LABEL: test_mm_andnot_pd
Craig Topperd0681d52016-08-31 05:38:55 +000086 // CHECK: xor <2 x i64> %{{.*}}, <i64 -1, i64 -1>
87 // CHECK: and <2 x i64>
Simon Pilgrim3f64bb92016-05-19 09:52:59 +000088 return _mm_andnot_pd(A, B);
89}
90
91__m128i test_mm_andnot_si128(__m128i A, __m128i B) {
92 // CHECK-LABEL: test_mm_andnot_si128
93 // CHECK: xor <2 x i64> %{{.*}}, <i64 -1, i64 -1>
94 // CHECK: and <2 x i64>
95 return _mm_andnot_si128(A, B);
96}
97
Simon Pilgrima5c04932015-11-29 20:23:00 +000098__m128i test_mm_avg_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +000099 // CHECK-LABEL: test_mm_avg_epu8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000100 // CHECK: call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000101 return _mm_avg_epu8(A, B);
102}
103
104__m128i test_mm_avg_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000105 // CHECK-LABEL: test_mm_avg_epu16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000106 // CHECK: call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000107 return _mm_avg_epu16(A, B);
108}
109
110__m128i test_mm_bslli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000111 // CHECK-LABEL: test_mm_bslli_si128
112 // 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 +0000113 return _mm_bslli_si128(A, 5);
114}
115
116__m128i test_mm_bsrli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000117 // CHECK-LABEL: test_mm_bsrli_si128
118 // 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 +0000119 return _mm_bsrli_si128(A, 5);
120}
121
Simon Pilgrimcddcd2b2016-05-19 11:03:48 +0000122__m128 test_mm_castpd_ps(__m128d A) {
123 // CHECK-LABEL: test_mm_castpd_ps
124 // CHECK: bitcast <2 x double> %{{.*}} to <4 x float>
125 return _mm_castpd_ps(A);
126}
127
128__m128i test_mm_castpd_si128(__m128d A) {
129 // CHECK-LABEL: test_mm_castpd_si128
130 // CHECK: bitcast <2 x double> %{{.*}} to <2 x i64>
131 return _mm_castpd_si128(A);
132}
133
134__m128d test_mm_castps_pd(__m128 A) {
135 // CHECK-LABEL: test_mm_castps_pd
136 // CHECK: bitcast <4 x float> %{{.*}} to <2 x double>
137 return _mm_castps_pd(A);
138}
139
140__m128i test_mm_castps_si128(__m128 A) {
141 // CHECK-LABEL: test_mm_castps_si128
142 // CHECK: bitcast <4 x float> %{{.*}} to <2 x i64>
143 return _mm_castps_si128(A);
144}
145
146__m128d test_mm_castsi128_pd(__m128i A) {
147 // CHECK-LABEL: test_mm_castsi128_pd
148 // CHECK: bitcast <2 x i64> %{{.*}} to <2 x double>
149 return _mm_castsi128_pd(A);
150}
151
152__m128 test_mm_castsi128_ps(__m128i A) {
153 // CHECK-LABEL: test_mm_castsi128_ps
154 // CHECK: bitcast <2 x i64> %{{.*}} to <4 x float>
155 return _mm_castsi128_ps(A);
156}
157
Simon Pilgrima5c04932015-11-29 20:23:00 +0000158void test_mm_clflush(void* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000159 // CHECK-LABEL: test_mm_clflush
160 // CHECK: call void @llvm.x86.sse2.clflush(i8* %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000161 _mm_clflush(A);
162}
163
164__m128i test_mm_cmpeq_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000165 // CHECK-LABEL: test_mm_cmpeq_epi8
166 // CHECK: icmp eq <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000167 return _mm_cmpeq_epi8(A, B);
168}
169
170__m128i test_mm_cmpeq_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000171 // CHECK-LABEL: test_mm_cmpeq_epi16
172 // CHECK: icmp eq <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000173 return _mm_cmpeq_epi16(A, B);
174}
175
176__m128i test_mm_cmpeq_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000177 // CHECK-LABEL: test_mm_cmpeq_epi32
178 // CHECK: icmp eq <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000179 return _mm_cmpeq_epi32(A, B);
180}
181
182__m128d test_mm_cmpeq_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000183 // CHECK-LABEL: test_mm_cmpeq_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000184 // CHECK: [[CMP:%.*]] = fcmp oeq <2 x double>
185 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
186 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
187 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000188 return _mm_cmpeq_pd(A, B);
189}
190
191__m128d test_mm_cmpeq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000192 // CHECK-LABEL: test_mm_cmpeq_sd
193 // 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 +0000194 return _mm_cmpeq_sd(A, B);
195}
196
197__m128d test_mm_cmpge_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000198 // CHECK-LABEL: test_mm_cmpge_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000199 // CHECK: [[CMP:%.*]] = fcmp ole <2 x double>
200 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
201 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
202 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000203 return _mm_cmpge_pd(A, B);
204}
205
206__m128d test_mm_cmpge_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000207 // CHECK-LABEL: test_mm_cmpge_sd
208 // 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 +0000209 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
210 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
211 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
212 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000213 return _mm_cmpge_sd(A, B);
214}
215
216__m128i test_mm_cmpgt_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000217 // CHECK-LABEL: test_mm_cmpgt_epi8
218 // CHECK: icmp sgt <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000219 return _mm_cmpgt_epi8(A, B);
220}
221
222__m128i test_mm_cmpgt_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000223 // CHECK-LABEL: test_mm_cmpgt_epi16
224 // CHECK: icmp sgt <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000225 return _mm_cmpgt_epi16(A, B);
226}
227
228__m128i test_mm_cmpgt_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000229 // CHECK-LABEL: test_mm_cmpgt_epi32
230 // CHECK: icmp sgt <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000231 return _mm_cmpgt_epi32(A, B);
232}
233
234__m128d test_mm_cmpgt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000235 // CHECK-LABEL: test_mm_cmpgt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000236 // CHECK: [[CMP:%.*]] = fcmp olt <2 x double>
237 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
238 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
239 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000240 return _mm_cmpgt_pd(A, B);
241}
242
243__m128d test_mm_cmpgt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000244 // CHECK-LABEL: test_mm_cmpgt_sd
245 // 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 +0000246 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
247 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
248 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
249 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000250 return _mm_cmpgt_sd(A, B);
251}
252
253__m128d test_mm_cmple_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000254 // CHECK-LABEL: test_mm_cmple_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000255 // CHECK: [[CMP:%.*]] = fcmp ole <2 x double>
256 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
257 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
258 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000259 return _mm_cmple_pd(A, B);
260}
261
262__m128d test_mm_cmple_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000263 // CHECK-LABEL: test_mm_cmple_sd
264 // 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 +0000265 return _mm_cmple_sd(A, B);
266}
267
268__m128i test_mm_cmplt_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000269 // CHECK-LABEL: test_mm_cmplt_epi8
270 // CHECK: icmp sgt <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000271 return _mm_cmplt_epi8(A, B);
272}
273
274__m128i test_mm_cmplt_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000275 // CHECK-LABEL: test_mm_cmplt_epi16
276 // CHECK: icmp sgt <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000277 return _mm_cmplt_epi16(A, B);
278}
279
280__m128i test_mm_cmplt_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000281 // CHECK-LABEL: test_mm_cmplt_epi32
282 // CHECK: icmp sgt <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000283 return _mm_cmplt_epi32(A, B);
284}
285
286__m128d test_mm_cmplt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000287 // CHECK-LABEL: test_mm_cmplt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000288 // CHECK: [[CMP:%.*]] = fcmp olt <2 x double>
289 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
290 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
291 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000292 return _mm_cmplt_pd(A, B);
293}
294
295__m128d test_mm_cmplt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000296 // CHECK-LABEL: test_mm_cmplt_sd
297 // 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 +0000298 return _mm_cmplt_sd(A, B);
299}
300
301__m128d test_mm_cmpneq_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000302 // CHECK-LABEL: test_mm_cmpneq_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000303 // CHECK: [[CMP:%.*]] = fcmp une <2 x double>
304 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
305 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
306 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000307 return _mm_cmpneq_pd(A, B);
308}
309
310__m128d test_mm_cmpneq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000311 // CHECK-LABEL: test_mm_cmpneq_sd
312 // 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 +0000313 return _mm_cmpneq_sd(A, B);
314}
315
316__m128d test_mm_cmpnge_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000317 // CHECK-LABEL: test_mm_cmpnge_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000318 // CHECK: [[CMP:%.*]] = fcmp ugt <2 x double>
319 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
320 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
321 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000322 return _mm_cmpnge_pd(A, B);
323}
324
325__m128d test_mm_cmpnge_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000326 // CHECK-LABEL: test_mm_cmpnge_sd
327 // 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 +0000328 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
329 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
330 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
331 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000332 return _mm_cmpnge_sd(A, B);
333}
334
335__m128d test_mm_cmpngt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000336 // CHECK-LABEL: test_mm_cmpngt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000337 // CHECK: [[CMP:%.*]] = fcmp uge <2 x double>
338 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
339 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
340 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000341 return _mm_cmpngt_pd(A, B);
342}
343
344__m128d test_mm_cmpngt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000345 // CHECK-LABEL: test_mm_cmpngt_sd
346 // 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 +0000347 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
348 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
349 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
350 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000351 return _mm_cmpngt_sd(A, B);
352}
353
354__m128d test_mm_cmpnle_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000355 // CHECK-LABEL: test_mm_cmpnle_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000356 // CHECK: [[CMP:%.*]] = fcmp ugt <2 x double>
357 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
358 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
359 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000360 return _mm_cmpnle_pd(A, B);
361}
362
363__m128d test_mm_cmpnle_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000364 // CHECK-LABEL: test_mm_cmpnle_sd
365 // 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 +0000366 return _mm_cmpnle_sd(A, B);
367}
368
369__m128d test_mm_cmpnlt_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000370 // CHECK-LABEL: test_mm_cmpnlt_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000371 // CHECK: [[CMP:%.*]] = fcmp uge <2 x double>
372 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
373 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
374 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000375 return _mm_cmpnlt_pd(A, B);
376}
377
378__m128d test_mm_cmpnlt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000379 // CHECK-LABEL: test_mm_cmpnlt_sd
380 // 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 +0000381 return _mm_cmpnlt_sd(A, B);
382}
383
384__m128d test_mm_cmpord_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000385 // CHECK-LABEL: test_mm_cmpord_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000386 // CHECK: [[CMP:%.*]] = fcmp ord <2 x double>
387 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
388 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
389 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000390 return _mm_cmpord_pd(A, B);
391}
392
393__m128d test_mm_cmpord_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000394 // CHECK-LABEL: test_mm_cmpord_sd
395 // 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 +0000396 return _mm_cmpord_sd(A, B);
397}
398
399__m128d test_mm_cmpunord_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000400 // CHECK-LABEL: test_mm_cmpunord_pd
Sanjay Patel280cfd12016-06-15 21:20:04 +0000401 // CHECK: [[CMP:%.*]] = fcmp uno <2 x double>
402 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64>
403 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double>
404 // CHECK-NEXT: ret <2 x double> [[BC]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000405 return _mm_cmpunord_pd(A, B);
406}
407
408__m128d test_mm_cmpunord_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000409 // CHECK-LABEL: test_mm_cmpunord_sd
410 // 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 +0000411 return _mm_cmpunord_sd(A, B);
412}
413
414int test_mm_comieq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000415 // CHECK-LABEL: test_mm_comieq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000416 // CHECK: call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000417 return _mm_comieq_sd(A, B);
418}
419
420int test_mm_comige_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000421 // CHECK-LABEL: test_mm_comige_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000422 // CHECK: call i32 @llvm.x86.sse2.comige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000423 return _mm_comige_sd(A, B);
424}
425
426int test_mm_comigt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000427 // CHECK-LABEL: test_mm_comigt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000428 // CHECK: call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000429 return _mm_comigt_sd(A, B);
430}
431
432int test_mm_comile_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000433 // CHECK-LABEL: test_mm_comile_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000434 // CHECK: call i32 @llvm.x86.sse2.comile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000435 return _mm_comile_sd(A, B);
436}
437
438int test_mm_comilt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000439 // CHECK-LABEL: test_mm_comilt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000440 // CHECK: call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000441 return _mm_comilt_sd(A, B);
442}
443
444int test_mm_comineq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000445 // CHECK-LABEL: test_mm_comineq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000446 // CHECK: call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000447 return _mm_comineq_sd(A, B);
448}
449
450__m128d test_mm_cvtepi32_pd(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000451 // CHECK-LABEL: test_mm_cvtepi32_pd
Simon Pilgrim90770c72016-05-23 22:13:02 +0000452 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <2 x i32> <i32 0, i32 1>
453 // CHECK: sitofp <2 x i32> %{{.*}} to <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000454 return _mm_cvtepi32_pd(A);
455}
456
457__m128 test_mm_cvtepi32_ps(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000458 // CHECK-LABEL: test_mm_cvtepi32_ps
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000459 // CHECK: call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000460 return _mm_cvtepi32_ps(A);
461}
462
463__m128i test_mm_cvtpd_epi32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000464 // CHECK-LABEL: test_mm_cvtpd_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000465 // CHECK: call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000466 return _mm_cvtpd_epi32(A);
467}
468
469__m128 test_mm_cvtpd_ps(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000470 // CHECK-LABEL: test_mm_cvtpd_ps
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000471 // CHECK: call <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000472 return _mm_cvtpd_ps(A);
473}
474
475__m128i test_mm_cvtps_epi32(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000476 // CHECK-LABEL: test_mm_cvtps_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000477 // CHECK: call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000478 return _mm_cvtps_epi32(A);
479}
480
481__m128d test_mm_cvtps_pd(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000482 // CHECK-LABEL: test_mm_cvtps_pd
Simon Pilgrim90770c72016-05-23 22:13:02 +0000483 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <2 x i32> <i32 0, i32 1>
484 // CHECK: fpext <2 x float> %{{.*}} to <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000485 return _mm_cvtps_pd(A);
486}
487
488double test_mm_cvtsd_f64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000489 // CHECK-LABEL: test_mm_cvtsd_f64
490 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000491 return _mm_cvtsd_f64(A);
492}
493
494int test_mm_cvtsd_si32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000495 // CHECK-LABEL: test_mm_cvtsd_si32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000496 // CHECK: call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000497 return _mm_cvtsd_si32(A);
498}
499
500long long test_mm_cvtsd_si64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000501 // CHECK-LABEL: test_mm_cvtsd_si64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000502 // CHECK: call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000503 return _mm_cvtsd_si64(A);
504}
505
506__m128 test_mm_cvtsd_ss(__m128 A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000507 // CHECK-LABEL: test_mm_cvtsd_ss
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000508 // CHECK: call <4 x float> @llvm.x86.sse2.cvtsd2ss(<4 x float> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000509 return _mm_cvtsd_ss(A, B);
510}
511
512int test_mm_cvtsi128_si32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000513 // CHECK-LABEL: test_mm_cvtsi128_si32
514 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000515 return _mm_cvtsi128_si32(A);
516}
517
518long long test_mm_cvtsi128_si64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000519 // CHECK-LABEL: test_mm_cvtsi128_si64
520 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000521 return _mm_cvtsi128_si64(A);
522}
523
524__m128d test_mm_cvtsi32_sd(__m128d A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000525 // CHECK-LABEL: test_mm_cvtsi32_sd
526 // CHECK: sitofp i32 %{{.*}} to double
527 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000528 return _mm_cvtsi32_sd(A, B);
529}
530
531__m128i test_mm_cvtsi32_si128(int A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000532 // CHECK-LABEL: test_mm_cvtsi32_si128
533 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000534 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 1
535 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 2
536 // CHECK: insertelement <4 x i32> %{{.*}}, i32 0, i32 3
Simon Pilgrima5c04932015-11-29 20:23:00 +0000537 return _mm_cvtsi32_si128(A);
538}
539
540__m128d test_mm_cvtsi64_sd(__m128d A, long long B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000541 // CHECK-LABEL: test_mm_cvtsi64_sd
542 // CHECK: sitofp i64 %{{.*}} to double
543 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000544 return _mm_cvtsi64_sd(A, B);
545}
546
547__m128i test_mm_cvtsi64_si128(long long A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000548 // CHECK-LABEL: test_mm_cvtsi64_si128
549 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000550 // CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000551 return _mm_cvtsi64_si128(A);
552}
553
554__m128d test_mm_cvtss_sd(__m128d A, __m128 B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000555 // CHECK-LABEL: test_mm_cvtss_sd
556 // CHECK: extractelement <4 x float> %{{.*}}, i32 0
557 // CHECK: fpext float %{{.*}} to double
558 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000559 return _mm_cvtss_sd(A, B);
560}
561
562__m128i test_mm_cvttpd_epi32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000563 // CHECK-LABEL: test_mm_cvttpd_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000564 // CHECK: call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000565 return _mm_cvttpd_epi32(A);
566}
567
568__m128i test_mm_cvttps_epi32(__m128 A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000569 // CHECK-LABEL: test_mm_cvttps_epi32
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000570 // CHECK: call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000571 return _mm_cvttps_epi32(A);
572}
573
574int test_mm_cvttsd_si32(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000575 // CHECK-LABEL: test_mm_cvttsd_si32
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000576 // CHECK: call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000577 return _mm_cvttsd_si32(A);
578}
579
580long long test_mm_cvttsd_si64(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000581 // CHECK-LABEL: test_mm_cvttsd_si64
Simon Pilgrime3b9ee02016-07-20 10:18:01 +0000582 // CHECK: call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000583 return _mm_cvttsd_si64(A);
584}
585
586__m128d test_mm_div_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000587 // CHECK-LABEL: test_mm_div_pd
588 // CHECK: fdiv <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000589 return _mm_div_pd(A, B);
590}
591
592__m128d test_mm_div_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000593 // CHECK-LABEL: test_mm_div_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000594 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
595 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000596 // CHECK: fdiv double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000597 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000598 return _mm_div_sd(A, B);
599}
600
601// Lowering to pextrw requires optimization.
602int test_mm_extract_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000603 // CHECK-LABEL: test_mm_extract_epi16
604 // CHECK: [[x:%.*]] = and i32 %{{.*}}, 7
605 // CHECK: extractelement <8 x i16> %{{.*}}, i32 [[x]]
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000606 // CHECK: zext i16 %{{.*}} to i32
607 return _mm_extract_epi16(A, 9);
Simon Pilgrima5c04932015-11-29 20:23:00 +0000608}
609
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000610__m128i test_mm_insert_epi16(__m128i A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000611 // CHECK-LABEL: test_mm_insert_epi16
612 // CHECK: [[x:%.*]] = and i32 %{{.*}}, 7
613 // CHECK: insertelement <8 x i16> %{{.*}}, i32 [[x]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000614 return _mm_insert_epi16(A, B, 8);
615}
616
617void test_mm_lfence() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000618 // CHECK-LABEL: test_mm_lfence
619 // CHECK: call void @llvm.x86.sse2.lfence()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000620 _mm_lfence();
621}
622
623__m128d test_mm_load_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000624 // CHECK-LABEL: test_mm_load_pd
625 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +0000626 return _mm_load_pd(A);
627}
628
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000629__m128d test_mm_load_pd1(double const* A) {
630 // CHECK-LABEL: test_mm_load_pd1
631 // CHECK: load double, double* %{{.*}}, align 8
632 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
633 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
634 return _mm_load_pd1(A);
635}
636
Simon Pilgrima5c04932015-11-29 20:23:00 +0000637__m128d test_mm_load_sd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000638 // CHECK-LABEL: test_mm_load_sd
Simon Pilgrim0e909362016-05-30 19:20:55 +0000639 // CHECK: load double, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000640 return _mm_load_sd(A);
641}
642
643__m128i test_mm_load_si128(__m128i const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000644 // CHECK-LABEL: test_mm_load_si128
645 // CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +0000646 return _mm_load_si128(A);
647}
648
649__m128d test_mm_load1_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000650 // CHECK-LABEL: test_mm_load1_pd
651 // CHECK: load double, double* %{{.*}}, align 8
652 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
653 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000654 return _mm_load1_pd(A);
655}
656
657__m128d test_mm_loadh_pd(__m128d x, void* y) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000658 // CHECK-LABEL: test_mm_loadh_pd
659 // CHECK: load double, double* %{{.*}}, align 1{{$}}
Simon Pilgrim2d1decf2016-05-17 22:03:31 +0000660 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +0000661 return _mm_loadh_pd(x, y);
662}
663
Simon Pilgrim2d1decf2016-05-17 22:03:31 +0000664__m128i test_mm_loadl_epi64(__m128i* y) {
665 // CHECK: test_mm_loadl_epi64
666 // CHECK: load i64, i64* {{.*}}, align 1{{$}}
667 // CHECK: insertelement <2 x i64> undef, i64 {{.*}}, i32 0
668 // CHECK: insertelement <2 x i64> {{.*}}, i64 0, i32 1
669 return _mm_loadl_epi64(y);
670}
671
672__m128d test_mm_loadl_pd(__m128d x, void* y) {
673 // CHECK-LABEL: test_mm_loadl_pd
674 // CHECK: load double, double* %{{.*}}, align 1{{$}}
675 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
676 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
677 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
678 return _mm_loadl_pd(x, y);
679}
680
Simon Pilgrima5c04932015-11-29 20:23:00 +0000681__m128d test_mm_loadr_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000682 // CHECK-LABEL: test_mm_loadr_pd
683 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 16
684 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>
Simon Pilgrima5c04932015-11-29 20:23:00 +0000685 return _mm_loadr_pd(A);
686}
687
688__m128d test_mm_loadu_pd(double const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000689 // CHECK-LABEL: test_mm_loadu_pd
Simon Pilgrim0e909362016-05-30 19:20:55 +0000690 // CHECK: load <2 x double>, <2 x double>* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000691 return _mm_loadu_pd(A);
692}
693
694__m128i test_mm_loadu_si128(__m128i const* A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000695 // CHECK-LABEL: test_mm_loadu_si128
Simon Pilgrim0e909362016-05-30 19:20:55 +0000696 // CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000697 return _mm_loadu_si128(A);
698}
699
Simon Pilgrim63500542016-06-29 14:04:08 +0000700__m128i test_mm_loadu_si64(void const* A) {
701 // CHECK-LABEL: test_mm_loadu_si64
702 // CHECK: load i64, i64* %{{.*}}, align 1{{$}}
703 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
704 // CHECK: insertelement <2 x i64> %{{.*}}, i64 0, i32 1
705 return _mm_loadu_si64(A);
706}
707
Simon Pilgrima5c04932015-11-29 20:23:00 +0000708__m128i test_mm_madd_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000709 // CHECK-LABEL: test_mm_madd_epi16
710 // CHECK: call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000711 return _mm_madd_epi16(A, B);
712}
713
714void test_mm_maskmoveu_si128(__m128i A, __m128i B, char* C) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000715 // CHECK-LABEL: test_mm_maskmoveu_si128
716 // CHECK: call void @llvm.x86.sse2.maskmov.dqu(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i8* %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000717 _mm_maskmoveu_si128(A, B, C);
718}
719
720__m128i test_mm_max_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000721 // CHECK-LABEL: test_mm_max_epi16
Sanjay Patel7495ec02016-06-15 17:18:50 +0000722 // CHECK: [[CMP:%.*]] = icmp sgt <8 x i16> [[X:%.*]], [[Y:%.*]]
723 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i16> [[X]], <8 x i16> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000724 return _mm_max_epi16(A, B);
725}
726
727__m128i test_mm_max_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000728 // CHECK-LABEL: test_mm_max_epu8
Sanjay Patel7495ec02016-06-15 17:18:50 +0000729 // CHECK: [[CMP:%.*]] = icmp ugt <16 x i8> [[X:%.*]], [[Y:%.*]]
730 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i8> [[X]], <16 x i8> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000731 return _mm_max_epu8(A, B);
732}
733
734__m128d test_mm_max_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000735 // CHECK-LABEL: test_mm_max_pd
736 // CHECK: call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000737 return _mm_max_pd(A, B);
738}
739
740__m128d test_mm_max_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000741 // CHECK-LABEL: test_mm_max_sd
742 // CHECK: call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000743 return _mm_max_sd(A, B);
744}
745
746void test_mm_mfence() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000747 // CHECK-LABEL: test_mm_mfence
748 // CHECK: call void @llvm.x86.sse2.mfence()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000749 _mm_mfence();
750}
751
752__m128i test_mm_min_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000753 // CHECK-LABEL: test_mm_min_epi16
Sanjay Patel7495ec02016-06-15 17:18:50 +0000754 // CHECK: [[CMP:%.*]] = icmp slt <8 x i16> [[X:%.*]], [[Y:%.*]]
755 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i16> [[X]], <8 x i16> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000756 return _mm_min_epi16(A, B);
757}
758
759__m128i test_mm_min_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000760 // CHECK-LABEL: test_mm_min_epu8
Sanjay Patel7495ec02016-06-15 17:18:50 +0000761 // CHECK: [[CMP:%.*]] = icmp ult <16 x i8> [[X:%.*]], [[Y:%.*]]
762 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i8> [[X]], <16 x i8> [[Y]]
Simon Pilgrima5c04932015-11-29 20:23:00 +0000763 return _mm_min_epu8(A, B);
764}
765
766__m128d test_mm_min_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000767 // CHECK-LABEL: test_mm_min_pd
768 // CHECK: call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000769 return _mm_min_pd(A, B);
770}
771
772__m128d test_mm_min_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000773 // CHECK-LABEL: test_mm_min_sd
774 // CHECK: call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000775 return _mm_min_sd(A, B);
776}
777
Simon Pilgrim97728df2016-05-19 11:18:49 +0000778__m128i test_mm_move_epi64(__m128i A) {
779 // CHECK-LABEL: test_mm_move_epi64
780 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>
781 return _mm_move_epi64(A);
782}
783
784__m128d test_mm_move_sd(__m128d A, __m128d B) {
785 // CHECK-LABEL: test_mm_move_sd
786 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
787 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
788 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
789 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
790 return _mm_move_sd(A, B);
791}
792
Simon Pilgrima5c04932015-11-29 20:23:00 +0000793int test_mm_movemask_epi8(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000794 // CHECK-LABEL: test_mm_movemask_epi8
795 // CHECK: call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000796 return _mm_movemask_epi8(A);
797}
798
799int test_mm_movemask_pd(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000800 // CHECK-LABEL: test_mm_movemask_pd
801 // CHECK: call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000802 return _mm_movemask_pd(A);
803}
804
805__m128i test_mm_mul_epu32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000806 // CHECK-LABEL: test_mm_mul_epu32
807 // CHECK: call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000808 return _mm_mul_epu32(A, B);
809}
810
811__m128d test_mm_mul_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000812 // CHECK-LABEL: test_mm_mul_pd
813 // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000814 return _mm_mul_pd(A, B);
815}
816
817__m128d test_mm_mul_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000818 // CHECK-LABEL: test_mm_mul_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +0000819 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
820 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
821 // CHECK: fmul double
822 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +0000823 return _mm_mul_sd(A, B);
824}
825
826__m128i test_mm_mulhi_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000827 // CHECK-LABEL: test_mm_mulhi_epi16
828 // CHECK: call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000829 return _mm_mulhi_epi16(A, B);
830}
831
832__m128i test_mm_mulhi_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000833 // CHECK-LABEL: test_mm_mulhi_epu16
834 // CHECK: call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000835 return _mm_mulhi_epu16(A, B);
836}
837
838__m128i test_mm_mullo_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000839 // CHECK-LABEL: test_mm_mullo_epi16
840 // CHECK: mul <8 x i16> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000841 return _mm_mullo_epi16(A, B);
842}
843
844__m128d test_mm_or_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000845 // CHECK-LABEL: test_mm_or_pd
Craig Topperd0681d52016-08-31 05:38:55 +0000846 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000847 return _mm_or_pd(A, B);
848}
849
850__m128i test_mm_or_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000851 // CHECK-LABEL: test_mm_or_si128
852 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +0000853 return _mm_or_si128(A, B);
854}
855
856__m128i test_mm_packs_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000857 // CHECK-LABEL: test_mm_packs_epi16
858 // CHECK: call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000859 return _mm_packs_epi16(A, B);
860}
861
862__m128i test_mm_packs_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000863 // CHECK-LABEL: test_mm_packs_epi32
864 // CHECK: call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000865 return _mm_packs_epi32(A, B);
866}
867
868__m128i test_mm_packus_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000869 // CHECK-LABEL: test_mm_packus_epi16
870 // CHECK: call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000871 return _mm_packus_epi16(A, B);
872}
873
874void test_mm_pause() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000875 // CHECK-LABEL: test_mm_pause
876 // CHECK: call void @llvm.x86.sse2.pause()
Simon Pilgrima5c04932015-11-29 20:23:00 +0000877 return _mm_pause();
878}
879
880__m128i test_mm_sad_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +0000881 // CHECK-LABEL: test_mm_sad_epu8
882 // CHECK: call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +0000883 return _mm_sad_epu8(A, B);
884}
885
Simon Pilgrimcddcd2b2016-05-19 11:03:48 +0000886__m128i test_mm_set_epi8(char A, char B, char C, char D,
887 char E, char F, char G, char H,
888 char I, char J, char K, char L,
889 char M, char N, char O, char P) {
890 // CHECK-LABEL: test_mm_set_epi8
891 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
892 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
893 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
894 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
895 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
896 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
897 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
898 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
899 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
900 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
901 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
902 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
903 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
904 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
905 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
906 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
907 return _mm_set_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
908}
909
910__m128i test_mm_set_epi16(short A, short B, short C, short D,
911 short E, short F, short G, short H) {
912 // CHECK-LABEL: test_mm_set_epi16
913 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
914 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
915 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
916 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
917 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
918 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
919 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
920 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
921 return _mm_set_epi16(A, B, C, D, E, F, G, H);
922}
923
924__m128i test_mm_set_epi32(int A, int B, int C, int D) {
925 // CHECK-LABEL: test_mm_set_epi32
926 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
927 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
928 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
929 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
930 return _mm_set_epi32(A, B, C, D);
931}
932
933__m128i test_mm_set_epi64(__m64 A, __m64 B) {
934 // CHECK-LABEL: test_mm_set_epi64
935 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
936 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
937 return _mm_set_epi64(A, B);
938}
939
940__m128i test_mm_set_epi64x(long long A, long long B) {
941 // CHECK-LABEL: test_mm_set_epi64x
942 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
943 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
944 return _mm_set_epi64x(A, B);
945}
946
947__m128d test_mm_set_pd(double A, double B) {
948 // CHECK-LABEL: test_mm_set_pd
949 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
950 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
951 return _mm_set_pd(A, B);
952}
953
954__m128d test_mm_set_sd(double A) {
955 // CHECK-LABEL: test_mm_set_sd
956 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
957 // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 1
958 return _mm_set_sd(A);
959}
960
961__m128i test_mm_set1_epi8(char A) {
962 // CHECK-LABEL: test_mm_set1_epi8
963 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
964 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
965 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
966 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
967 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
968 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
969 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
970 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
971 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
972 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
973 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
974 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
975 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
976 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
977 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
978 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
979 return _mm_set1_epi8(A);
980}
981
982__m128i test_mm_set1_epi16(short A) {
983 // CHECK-LABEL: test_mm_set1_epi16
984 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
985 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
986 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
987 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
988 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
989 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
990 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
991 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
992 return _mm_set1_epi16(A);
993}
994
995__m128i test_mm_set1_epi32(int A) {
996 // CHECK-LABEL: test_mm_set1_epi32
997 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
998 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
999 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
1000 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
1001 return _mm_set1_epi32(A);
1002}
1003
1004__m128i test_mm_set1_epi64(__m64 A) {
1005 // CHECK-LABEL: test_mm_set1_epi64
1006 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
1007 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
1008 return _mm_set1_epi64(A);
1009}
1010
1011__m128i test_mm_set1_epi64x(long long A) {
1012 // CHECK-LABEL: test_mm_set1_epi64x
1013 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
1014 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
1015 return _mm_set1_epi64x(A);
1016}
1017
1018__m128d test_mm_set1_pd(double A) {
1019 // CHECK-LABEL: test_mm_set1_pd
1020 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1021 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
1022 return _mm_set1_pd(A);
1023}
1024
1025__m128i test_mm_setr_epi8(char A, char B, char C, char D,
1026 char E, char F, char G, char H,
1027 char I, char J, char K, char L,
1028 char M, char N, char O, char P) {
1029 // CHECK-LABEL: test_mm_setr_epi8
1030 // CHECK: insertelement <16 x i8> undef, i8 %{{.*}}, i32 0
1031 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 1
1032 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 2
1033 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 3
1034 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 4
1035 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 5
1036 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 6
1037 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 7
1038 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 8
1039 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 9
1040 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 10
1041 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 11
1042 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 12
1043 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 13
1044 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 14
1045 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 15
1046 return _mm_setr_epi8(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
1047}
1048
1049__m128i test_mm_setr_epi16(short A, short B, short C, short D,
1050 short E, short F, short G, short H) {
1051 // CHECK-LABEL: test_mm_setr_epi16
1052 // CHECK: insertelement <8 x i16> undef, i16 %{{.*}}, i32 0
1053 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 1
1054 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 2
1055 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 3
1056 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 4
1057 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 5
1058 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 6
1059 // CHECK: insertelement <8 x i16> %{{.*}}, i16 %{{.*}}, i32 7
1060 return _mm_setr_epi16(A, B, C, D, E, F, G, H);
1061}
1062
1063__m128i test_mm_setr_epi32(int A, int B, int C, int D) {
1064 // CHECK-LABEL: test_mm_setr_epi32
1065 // CHECK: insertelement <4 x i32> undef, i32 %{{.*}}, i32 0
1066 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
1067 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
1068 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
1069 return _mm_setr_epi32(A, B, C, D);
1070}
1071
1072__m128i test_mm_setr_epi64(__m64 A, __m64 B) {
1073 // CHECK-LABEL: test_mm_setr_epi64
1074 // CHECK: insertelement <2 x i64> undef, i64 %{{.*}}, i32 0
1075 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
1076 return _mm_setr_epi64(A, B);
1077}
1078
1079__m128d test_mm_setr_pd(double A, double B) {
1080 // CHECK-LABEL: test_mm_setr_pd
1081 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1082 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
1083 return _mm_setr_pd(A, B);
1084}
1085
Simon Pilgrima5c04932015-11-29 20:23:00 +00001086__m128d test_mm_setzero_pd() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001087 // CHECK-LABEL: test_mm_setzero_pd
1088 // CHECK: store <2 x double> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001089 return _mm_setzero_pd();
1090}
1091
1092__m128i test_mm_setzero_si128() {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001093 // CHECK-LABEL: test_mm_setzero_si128
1094 // CHECK: store <2 x i64> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001095 return _mm_setzero_si128();
1096}
1097
1098__m128i test_mm_shuffle_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001099 // CHECK-LABEL: test_mm_shuffle_epi32
1100 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> zeroinitializer
Simon Pilgrima5c04932015-11-29 20:23:00 +00001101 return _mm_shuffle_epi32(A, 0);
1102}
1103
1104__m128d test_mm_shuffle_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001105 // CHECK-LABEL: test_mm_shuffle_pd
1106 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001107 return _mm_shuffle_pd(A, B, 1);
1108}
1109
1110__m128i test_mm_shufflehi_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001111 // CHECK-LABEL: test_mm_shufflehi_epi16
1112 // 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 +00001113 return _mm_shufflehi_epi16(A, 0);
1114}
1115
1116__m128i test_mm_shufflelo_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001117 // CHECK-LABEL: test_mm_shufflelo_epi16
1118 // 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 +00001119 return _mm_shufflelo_epi16(A, 0);
1120}
1121
1122__m128i test_mm_sll_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001123 // CHECK-LABEL: test_mm_sll_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001124 // CHECK: call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001125 return _mm_sll_epi16(A, B);
1126}
1127
1128__m128i test_mm_sll_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001129 // CHECK-LABEL: test_mm_sll_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001130 // CHECK: call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001131 return _mm_sll_epi32(A, B);
1132}
1133
1134__m128i test_mm_sll_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001135 // CHECK-LABEL: test_mm_sll_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001136 // CHECK: call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001137 return _mm_sll_epi64(A, B);
1138}
1139
1140__m128i test_mm_slli_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001141 // CHECK-LABEL: test_mm_slli_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001142 // CHECK: call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001143 return _mm_slli_epi16(A, 1);
1144}
1145
1146__m128i test_mm_slli_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001147 // CHECK-LABEL: test_mm_slli_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001148 // CHECK: call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001149 return _mm_slli_epi32(A, 1);
1150}
1151
1152__m128i test_mm_slli_epi64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001153 // CHECK-LABEL: test_mm_slli_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001154 // CHECK: call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001155 return _mm_slli_epi64(A, 1);
1156}
1157
1158__m128i test_mm_slli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001159 // CHECK-LABEL: test_mm_slli_si128
1160 // 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 +00001161 return _mm_slli_si128(A, 5);
1162}
1163
Craig Topper50e3dfe2016-06-25 07:31:14 +00001164__m128i test_mm_slli_si128_2(__m128i A) {
1165 // CHECK-LABEL: test_mm_slli_si128_2
1166 // 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>
1167 return _mm_slli_si128(A, 17);
1168}
1169
Simon Pilgrima5c04932015-11-29 20:23:00 +00001170__m128d test_mm_sqrt_pd(__m128d A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001171 // CHECK-LABEL: test_mm_sqrt_pd
1172 // CHECK: call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001173 return _mm_sqrt_pd(A);
1174}
1175
1176__m128d test_mm_sqrt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001177 // CHECK-LABEL: test_mm_sqrt_sd
1178 // CHECK: call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %{{.*}})
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001179 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
1180 // CHECK: insertelement <2 x double> undef, double %{{.*}}, i32 0
1181 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
1182 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 1
Simon Pilgrima5c04932015-11-29 20:23:00 +00001183 return _mm_sqrt_sd(A, B);
1184}
1185
1186__m128i test_mm_sra_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001187 // CHECK-LABEL: test_mm_sra_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001188 // CHECK: call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001189 return _mm_sra_epi16(A, B);
1190}
1191
1192__m128i test_mm_sra_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001193 // CHECK-LABEL: test_mm_sra_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001194 // CHECK: call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001195 return _mm_sra_epi32(A, B);
1196}
1197
1198__m128i test_mm_srai_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001199 // CHECK-LABEL: test_mm_srai_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001200 // CHECK: call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001201 return _mm_srai_epi16(A, 1);
1202}
1203
1204__m128i test_mm_srai_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001205 // CHECK-LABEL: test_mm_srai_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001206 // CHECK: call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001207 return _mm_srai_epi32(A, 1);
1208}
1209
1210__m128i test_mm_srl_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001211 // CHECK-LABEL: test_mm_srl_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001212 // CHECK: call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001213 return _mm_srl_epi16(A, B);
1214}
1215
1216__m128i test_mm_srl_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001217 // CHECK-LABEL: test_mm_srl_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001218 // CHECK: call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001219 return _mm_srl_epi32(A, B);
1220}
1221
1222__m128i test_mm_srl_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001223 // CHECK-LABEL: test_mm_srl_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001224 // CHECK: call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001225 return _mm_srl_epi64(A, B);
1226}
1227
1228__m128i test_mm_srli_epi16(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001229 // CHECK-LABEL: test_mm_srli_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001230 // CHECK: call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001231 return _mm_srli_epi16(A, 1);
1232}
1233
1234__m128i test_mm_srli_epi32(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001235 // CHECK-LABEL: test_mm_srli_epi32
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001236 // CHECK: call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001237 return _mm_srli_epi32(A, 1);
1238}
1239
1240__m128i test_mm_srli_epi64(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001241 // CHECK-LABEL: test_mm_srli_epi64
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001242 // CHECK: call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %{{.*}}, i32 %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001243 return _mm_srli_epi64(A, 1);
1244}
1245
1246__m128i test_mm_srli_si128(__m128i A) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001247 // CHECK-LABEL: test_mm_srli_si128
1248 // 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 +00001249 return _mm_srli_si128(A, 5);
1250}
1251
Craig Topper50e3dfe2016-06-25 07:31:14 +00001252__m128i test_mm_srli_si128_2(__m128i A) {
1253 // CHECK-LABEL: test_mm_srli_si128_2
1254 // 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>
1255 return _mm_srli_si128(A, 17);
1256}
1257
Simon Pilgrima5c04932015-11-29 20:23:00 +00001258void test_mm_store_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001259 // CHECK-LABEL: test_mm_store_pd
1260 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +00001261 _mm_store_pd(A, B);
1262}
1263
Simon Pilgrim645e1ad2016-05-30 17:55:25 +00001264void test_mm_store_pd1(double* x, __m128d y) {
1265 // CHECK-LABEL: test_mm_store_pd1
1266 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> zeroinitializer
1267 // CHECK: store <2 x double> %{{.*}}, <2 x double>* {{.*}}, align 16
1268 _mm_store_pd1(x, y);
1269}
1270
Simon Pilgrima5c04932015-11-29 20:23:00 +00001271void test_mm_store_sd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001272 // CHECK-LABEL: test_mm_store_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001273 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001274 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001275 _mm_store_sd(A, B);
1276}
1277
1278void test_mm_store_si128(__m128i* A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001279 // CHECK-LABEL: test_mm_store_si128
1280 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
Simon Pilgrima5c04932015-11-29 20:23:00 +00001281 _mm_store_si128(A, B);
1282}
1283
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001284void test_mm_store1_pd(double* x, __m128d y) {
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001285 // CHECK-LABEL: test_mm_store1_pd
Simon Pilgrim645e1ad2016-05-30 17:55:25 +00001286 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> zeroinitializer
1287 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001288 _mm_store1_pd(x, y);
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001289}
1290
Simon Pilgrima5c04932015-11-29 20:23:00 +00001291void test_mm_storeh_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001292 // CHECK-LABEL: test_mm_storeh_pd
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001293 // CHECK: extractelement <2 x double> %{{.*}}, i32 1
Simon Pilgrim0e909362016-05-30 19:20:55 +00001294 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001295 _mm_storeh_pd(A, B);
1296}
1297
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001298void test_mm_storel_epi64(__m128i x, void* y) {
1299 // CHECK-LABEL: test_mm_storel_epi64
1300 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
1301 // CHECK: store {{.*}} i64* {{.*}}, align 1{{$}}
1302 _mm_storel_epi64(y, x);
1303}
1304
Simon Pilgrima5c04932015-11-29 20:23:00 +00001305void test_mm_storel_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001306 // CHECK-LABEL: test_mm_storel_pd
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001307 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim0e909362016-05-30 19:20:55 +00001308 // CHECK: store double %{{.*}}, double* %{{.*}}, align 1{{$}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001309 _mm_storel_pd(A, B);
1310}
1311
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001312void test_mm_storer_pd(__m128d A, double* B) {
1313 // CHECK-LABEL: test_mm_storer_pd
1314 // CHECK: shufflevector <2 x double> {{.*}}, <2 x double> {{.*}}, <2 x i32> <i32 1, i32 0>
1315 // CHECK: store {{.*}} <2 x double>* {{.*}}, align 16{{$}}
1316 _mm_storer_pd(B, A);
1317}
1318
Simon Pilgrima5c04932015-11-29 20:23:00 +00001319void test_mm_storeu_pd(double* A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001320 // CHECK-LABEL: test_mm_storeu_pd
Craig Topper09175da2016-05-30 17:10:30 +00001321 // CHECK: store {{.*}} <2 x double>* {{.*}}, align 1{{$}}
1322 // CHECK-NEXT: ret void
Simon Pilgrima5c04932015-11-29 20:23:00 +00001323 _mm_storeu_pd(A, B);
1324}
1325
1326void test_mm_storeu_si128(__m128i* A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001327 // CHECK-LABEL: test_mm_storeu_si128
Craig Topper09175da2016-05-30 17:10:30 +00001328 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
1329 // CHECK-NEXT: ret void
Simon Pilgrima5c04932015-11-29 20:23:00 +00001330 _mm_storeu_si128(A, B);
1331}
1332
1333void test_mm_stream_pd(double *A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001334 // CHECK-LABEL: test_mm_stream_pd
1335 // CHECK: store <2 x double> %{{.*}}, <2 x double>* %{{.*}}, align 16, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001336 _mm_stream_pd(A, B);
1337}
1338
1339void test_mm_stream_si32(int *A, int B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001340 // CHECK-LABEL: test_mm_stream_si32
1341 // CHECK: store i32 %{{.*}}, i32* %{{.*}}, align 1, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001342 _mm_stream_si32(A, B);
1343}
1344
1345void test_mm_stream_si64(long long *A, long long B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001346 // CHECK-LABEL: test_mm_stream_si64
1347 // CHECK: store i64 %{{.*}}, i64* %{{.*}}, align 1, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001348 _mm_stream_si64(A, B);
1349}
1350
1351void test_mm_stream_si128(__m128i *A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001352 // CHECK-LABEL: test_mm_stream_si128
1353 // CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16, !nontemporal
Simon Pilgrima5c04932015-11-29 20:23:00 +00001354 _mm_stream_si128(A, B);
1355}
1356
1357__m128i test_mm_sub_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001358 // CHECK-LABEL: test_mm_sub_epi8
1359 // CHECK: sub <16 x i8>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001360 return _mm_sub_epi8(A, B);
1361}
1362
1363__m128i test_mm_sub_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001364 // CHECK-LABEL: test_mm_sub_epi16
1365 // CHECK: sub <8 x i16>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001366 return _mm_sub_epi16(A, B);
1367}
1368
1369__m128i test_mm_sub_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001370 // CHECK-LABEL: test_mm_sub_epi32
1371 // CHECK: sub <4 x i32>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001372 return _mm_sub_epi32(A, B);
1373}
1374
1375__m128i test_mm_sub_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001376 // CHECK-LABEL: test_mm_sub_epi64
1377 // CHECK: sub <2 x i64>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001378 return _mm_sub_epi64(A, B);
1379}
1380
1381__m128d test_mm_sub_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001382 // CHECK-LABEL: test_mm_sub_pd
1383 // CHECK: fsub <2 x double>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001384 return _mm_sub_pd(A, B);
1385}
1386
1387__m128d test_mm_sub_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001388 // CHECK-LABEL: test_mm_sub_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001389 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
1390 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001391 // CHECK: fsub double
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001392 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
Simon Pilgrima5c04932015-11-29 20:23:00 +00001393 return _mm_sub_sd(A, B);
1394}
1395
1396__m128i test_mm_subs_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001397 // CHECK-LABEL: test_mm_subs_epi8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001398 // CHECK: call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001399 return _mm_subs_epi8(A, B);
1400}
1401
1402__m128i test_mm_subs_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001403 // CHECK-LABEL: test_mm_subs_epi16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001404 // CHECK: call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001405 return _mm_subs_epi16(A, B);
1406}
1407
1408__m128i test_mm_subs_epu8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001409 // CHECK-LABEL: test_mm_subs_epu8
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001410 // CHECK: call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001411 return _mm_subs_epu8(A, B);
1412}
1413
1414__m128i test_mm_subs_epu16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001415 // CHECK-LABEL: test_mm_subs_epu16
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001416 // CHECK: call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %{{.*}}, <8 x i16> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001417 return _mm_subs_epu16(A, B);
1418}
1419
1420int test_mm_ucomieq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001421 // CHECK-LABEL: test_mm_ucomieq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001422 // CHECK: call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001423 return _mm_ucomieq_sd(A, B);
1424}
1425
1426int test_mm_ucomige_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001427 // CHECK-LABEL: test_mm_ucomige_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001428 // CHECK: call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001429 return _mm_ucomige_sd(A, B);
1430}
1431
1432int test_mm_ucomigt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001433 // CHECK-LABEL: test_mm_ucomigt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001434 // CHECK: call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001435 return _mm_ucomigt_sd(A, B);
1436}
1437
1438int test_mm_ucomile_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001439 // CHECK-LABEL: test_mm_ucomile_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001440 // CHECK: call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001441 return _mm_ucomile_sd(A, B);
1442}
1443
1444int test_mm_ucomilt_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001445 // CHECK-LABEL: test_mm_ucomilt_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001446 // CHECK: call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001447 return _mm_ucomilt_sd(A, B);
1448}
1449
1450int test_mm_ucomineq_sd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001451 // CHECK-LABEL: test_mm_ucomineq_sd
Simon Pilgrim3f64bb92016-05-19 09:52:59 +00001452 // CHECK: call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %{{.*}}, <2 x double> %{{.*}})
Simon Pilgrima5c04932015-11-29 20:23:00 +00001453 return _mm_ucomineq_sd(A, B);
1454}
1455
Simon Pilgrim2d1decf2016-05-17 22:03:31 +00001456__m128d test_mm_undefined_pd() {
1457 // CHECK-LABEL: @test_mm_undefined_pd
1458 // CHECK: ret <2 x double> undef
1459 return _mm_undefined_pd();
1460}
1461
1462__m128i test_mm_undefined_si128() {
1463 // CHECK-LABEL: @test_mm_undefined_si128
1464 // CHECK: ret <2 x i64> undef
1465 return _mm_undefined_si128();
1466}
1467
Simon Pilgrima5c04932015-11-29 20:23:00 +00001468__m128i test_mm_unpackhi_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001469 // CHECK-LABEL: test_mm_unpackhi_epi8
1470 // 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 +00001471 return _mm_unpackhi_epi8(A, B);
1472}
1473
1474__m128i test_mm_unpackhi_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001475 // CHECK-LABEL: test_mm_unpackhi_epi16
1476 // 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 +00001477 return _mm_unpackhi_epi16(A, B);
1478}
1479
1480__m128i test_mm_unpackhi_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001481 // CHECK-LABEL: test_mm_unpackhi_epi32
1482 // 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 +00001483 return _mm_unpackhi_epi32(A, B);
1484}
1485
1486__m128i test_mm_unpackhi_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001487 // CHECK-LABEL: test_mm_unpackhi_epi64
1488 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 3>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001489 return _mm_unpackhi_epi64(A, B);
1490}
1491
1492__m128d test_mm_unpackhi_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001493 // CHECK-LABEL: test_mm_unpackhi_pd
1494 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 3>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001495 return _mm_unpackhi_pd(A, B);
1496}
1497
1498__m128i test_mm_unpacklo_epi8(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001499 // CHECK-LABEL: test_mm_unpacklo_epi8
1500 // 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 +00001501 return _mm_unpacklo_epi8(A, B);
1502}
1503
1504__m128i test_mm_unpacklo_epi16(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001505 // CHECK-LABEL: test_mm_unpacklo_epi16
1506 // 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 +00001507 return _mm_unpacklo_epi16(A, B);
1508}
1509
1510__m128i test_mm_unpacklo_epi32(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001511 // CHECK-LABEL: test_mm_unpacklo_epi32
1512 // 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 +00001513 return _mm_unpacklo_epi32(A, B);
1514}
1515
1516__m128i test_mm_unpacklo_epi64(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001517 // CHECK-LABEL: test_mm_unpacklo_epi64
1518 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 0, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001519 return _mm_unpacklo_epi64(A, B);
1520}
1521
1522__m128d test_mm_unpacklo_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001523 // CHECK-LABEL: test_mm_unpacklo_pd
1524 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>
Simon Pilgrima5c04932015-11-29 20:23:00 +00001525 return _mm_unpacklo_pd(A, B);
1526}
1527
1528__m128d test_mm_xor_pd(__m128d A, __m128d B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001529 // CHECK-LABEL: test_mm_xor_pd
Craig Topperd0681d52016-08-31 05:38:55 +00001530 // CHECK: xor <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001531 return _mm_xor_pd(A, B);
1532}
1533
1534__m128i test_mm_xor_si128(__m128i A, __m128i B) {
Simon Pilgrim068c2ce2015-12-03 08:45:21 +00001535 // CHECK-LABEL: test_mm_xor_si128
1536 // CHECK: xor <2 x i64> %{{.*}}, %{{.*}}
Simon Pilgrima5c04932015-11-29 20:23:00 +00001537 return _mm_xor_si128(A, B);
1538}