1 // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +avx2 -emit-llvm -o - -Werror | FileCheck %s 2 // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +avx2 -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s 3 4 // Don't include mm_malloc.h, it's system specific. 5 #define __MM_MALLOC_H 6 7 #include <x86intrin.h> 8 9 // NOTE: This should match the tests in llvm/test/CodeGen/X86/avx2-intrinsics-fast-isel.ll 10 11 __m256i test_mm256_abs_epi8(__m256i a) { 12 // CHECK-LABEL: test_mm256_abs_epi8 13 // CHECK: call <32 x i8> @llvm.x86.avx2.pabs.b(<32 x i8> %{{.*}}) 14 return _mm256_abs_epi8(a); 15 } 16 17 __m256i test_mm256_abs_epi16(__m256i a) { 18 // CHECK-LABEL: test_mm256_abs_epi16 19 // CHECK: call <16 x i16> @llvm.x86.avx2.pabs.w(<16 x i16> %{{.*}}) 20 return _mm256_abs_epi16(a); 21 } 22 23 __m256i test_mm256_abs_epi32(__m256i a) { 24 // CHECK-LABEL: test_mm256_abs_epi32 25 // CHECK: call <8 x i32> @llvm.x86.avx2.pabs.d(<8 x i32> %{{.*}}) 26 return _mm256_abs_epi32(a); 27 } 28 29 __m256i test_mm256_add_epi8(__m256i a, __m256i b) { 30 // CHECK-LABEL: test_mm256_add_epi8 31 // CHECK: add <32 x i8> 32 return _mm256_add_epi8(a, b); 33 } 34 35 __m256i test_mm256_add_epi16(__m256i a, __m256i b) { 36 // CHECK-LABEL: test_mm256_add_epi16 37 // CHECK: add <16 x i16> 38 return _mm256_add_epi16(a, b); 39 } 40 41 __m256i test_mm256_add_epi32(__m256i a, __m256i b) { 42 // CHECK-LABEL: test_mm256_add_epi32 43 // CHECK: add <8 x i32> 44 return _mm256_add_epi32(a, b); 45 } 46 47 __m256i test_mm256_add_epi64(__m256i a, __m256i b) { 48 // CHECK-LABEL: test_mm256_add_epi64 49 // CHECK: add <4 x i64> 50 return _mm256_add_epi64(a, b); 51 } 52 53 __m256i test_mm256_adds_epi8(__m256i a, __m256i b) { 54 // CHECK-LABEL: test_mm256_adds_epi8 55 // CHECK: call <32 x i8> @llvm.x86.avx2.padds.b(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 56 return _mm256_adds_epi8(a, b); 57 } 58 59 __m256i test_mm256_adds_epi16(__m256i a, __m256i b) { 60 // CHECK-LABEL: test_mm256_adds_epi16 61 // CHECK: call <16 x i16> @llvm.x86.avx2.padds.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 62 return _mm256_adds_epi16(a, b); 63 } 64 65 __m256i test_mm256_adds_epu8(__m256i a, __m256i b) { 66 // CHECK-LABEL: test_mm256_adds_epu8 67 // CHECK: call <32 x i8> @llvm.x86.avx2.paddus.b(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 68 return _mm256_adds_epu8(a, b); 69 } 70 71 __m256i test_mm256_adds_epu16(__m256i a, __m256i b) { 72 // CHECK-LABEL: test_mm256_adds_epu16 73 // CHECK: call <16 x i16> @llvm.x86.avx2.paddus.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 74 return _mm256_adds_epu16(a, b); 75 } 76 77 __m256i test_mm256_alignr_epi8(__m256i a, __m256i b) { 78 // CHECK-LABEL: test_mm256_alignr_epi8 79 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <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, i32 32, i32 33, 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, i32 48, i32 49> 80 return _mm256_alignr_epi8(a, b, 2); 81 } 82 83 __m256i test2_mm256_alignr_epi8(__m256i a, __m256i b) { 84 // CHECK-LABEL: test2_mm256_alignr_epi8 85 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> zeroinitializer, <32 x i32> <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, i32 32, 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, i32 48> 86 return _mm256_alignr_epi8(a, b, 17); 87 } 88 89 __m256i test_mm256_and_si256(__m256i a, __m256i b) { 90 // CHECK-LABEL: test_mm256_and_si256 91 // CHECK: and <4 x i64> 92 return _mm256_and_si256(a, b); 93 } 94 95 __m256i test_mm256_andnot_si256(__m256i a, __m256i b) { 96 // CHECK-LABEL: test_mm256_andnot_si256 97 // CHECK: xor <4 x i64> 98 // CHECK: and <4 x i64> 99 return _mm256_andnot_si256(a, b); 100 } 101 102 __m256i test_mm256_avg_epu8(__m256i a, __m256i b) { 103 // CHECK-LABEL: test_mm256_avg_epu8 104 // CHECK: call <32 x i8> @llvm.x86.avx2.pavg.b(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 105 return _mm256_avg_epu8(a, b); 106 } 107 108 __m256i test_mm256_avg_epu16(__m256i a, __m256i b) { 109 // CHECK-LABEL: test_mm256_avg_epu16 110 // CHECK: call <16 x i16> @llvm.x86.avx2.pavg.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 111 return _mm256_avg_epu16(a, b); 112 } 113 114 // FIXME: We should also lower the __builtin_ia32_pblendw128 (and similar) 115 // functions to this IR. In the future we could delete the corresponding 116 // intrinsic in LLVM if it's not being used anymore. 117 __m256i test_mm256_blend_epi16(__m256i a, __m256i b) { 118 // CHECK-LABEL: test_mm256_blend_epi16 119 // CHECK-NOT: @llvm.x86.avx2.pblendw 120 // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 0, i32 17, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 25, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 121 return _mm256_blend_epi16(a, b, 2); 122 } 123 124 __m128i test_mm_blend_epi32(__m128i a, __m128i b) { 125 // CHECK-LABEL: test_mm_blend_epi32 126 // CHECK-NOT: @llvm.x86.avx2.pblendd.128 127 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 128 return _mm_blend_epi32(a, b, 0x35); 129 } 130 131 __m256i test_mm256_blend_epi32(__m256i a, __m256i b) { 132 // CHECK-LABEL: test_mm256_blend_epi32 133 // CHECK-NOT: @llvm.x86.avx2.pblendd.256 134 // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 13, i32 6, i32 7> 135 return _mm256_blend_epi32(a, b, 0x35); 136 } 137 138 __m256i test_mm256_blendv_epi8(__m256i a, __m256i b, __m256i m) { 139 // CHECK-LABEL: test_mm256_blendv_epi8 140 // CHECK: call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 141 return _mm256_blendv_epi8(a, b, m); 142 } 143 144 __m128i test_mm_broadcastb_epi8(__m128i a) { 145 // CHECK-LABEL: test_mm_broadcastb_epi8 146 // CHECK-NOT: @llvm.x86.avx2.pbroadcastb.128 147 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> zeroinitializer 148 return _mm_broadcastb_epi8(a); 149 } 150 151 __m256i test_mm256_broadcastb_epi8(__m128i a) { 152 // CHECK-LABEL: test_mm256_broadcastb_epi8 153 // CHECK-NOT: @llvm.x86.avx2.pbroadcastb.256 154 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <32 x i32> zeroinitializer 155 return _mm256_broadcastb_epi8(a); 156 } 157 158 __m128i test_mm_broadcastd_epi32(__m128i a) { 159 // CHECK-LABEL: test_mm_broadcastd_epi32 160 // CHECK-NOT: @llvm.x86.avx2.pbroadcastd.128 161 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> zeroinitializer 162 return _mm_broadcastd_epi32(a); 163 } 164 165 __m256i test_mm256_broadcastd_epi32(__m128i a) { 166 // CHECK-LABEL: test_mm256_broadcastd_epi32 167 // CHECK-NOT: @llvm.x86.avx2.pbroadcastd.256 168 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <8 x i32> zeroinitializer 169 return _mm256_broadcastd_epi32(a); 170 } 171 172 __m128i test_mm_broadcastq_epi64(__m128i a) { 173 // CHECK-LABEL: test_mm_broadcastq_epi64 174 // CHECK-NOT: @llvm.x86.avx2.pbroadcastq.128 175 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> zeroinitializer 176 return _mm_broadcastq_epi64(a); 177 } 178 179 __m256i test_mm256_broadcastq_epi64(__m128i a) { 180 // CHECK-LABEL: test_mm256_broadcastq_epi64 181 // CHECK-NOT: @llvm.x86.avx2.pbroadcastq.256 182 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <4 x i32> zeroinitializer 183 return _mm256_broadcastq_epi64(a); 184 } 185 186 __m128d test_mm_broadcastsd_pd(__m128d a) { 187 // CHECK-LABEL: test_mm_broadcastsd_pd 188 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> zeroinitializer 189 return _mm_broadcastsd_pd(a); 190 } 191 192 __m256d test_mm256_broadcastsd_pd(__m128d a) { 193 // CHECK-LABEL: test_mm256_broadcastsd_pd 194 // CHECK-NOT: @llvm.x86.avx2.vbroadcast.sd.pd.256 195 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <4 x i32> zeroinitializer 196 return _mm256_broadcastsd_pd(a); 197 } 198 199 __m256i test_mm256_broadcastsi128_si256(__m128i a) { 200 // CHECK-LABEL: test_mm256_broadcastsi128_si256 201 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 0, i32 1> 202 return _mm256_broadcastsi128_si256(a); 203 } 204 205 __m128 test_mm_broadcastss_ps(__m128 a) { 206 // CHECK-LABEL: test_mm_broadcastss_ps 207 // CHECK-NOT: @llvm.x86.avx2.vbroadcast.ss.ps 208 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> zeroinitializer 209 return _mm_broadcastss_ps(a); 210 } 211 212 __m256 test_mm256_broadcastss_ps(__m128 a) { 213 // CHECK-LABEL: test_mm256_broadcastss_ps 214 // CHECK-NOT: @llvm.x86.avx2.vbroadcast.ss.ps.256 215 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <8 x i32> zeroinitializer 216 return _mm256_broadcastss_ps(a); 217 } 218 219 __m128i test_mm_broadcastw_epi16(__m128i a) { 220 // CHECK-LABEL: test_mm_broadcastw_epi16 221 // CHECK-NOT: @llvm.x86.avx2.pbroadcastw.128 222 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> zeroinitializer 223 return _mm_broadcastw_epi16(a); 224 } 225 226 __m256i test_mm256_broadcastw_epi16(__m128i a) { 227 // CHECK-LABEL: test_mm256_broadcastw_epi16 228 // CHECK-NOT: @llvm.x86.avx2.pbroadcastw.256 229 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <16 x i32> zeroinitializer 230 return _mm256_broadcastw_epi16(a); 231 } 232 233 __m256i test_mm256_bslli_epi128(__m256i a) { 234 // CHECK-LABEL: test_mm256_bslli_epi128 235 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <i32 13, i32 14, i32 15, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 29, i32 30, i32 31, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60> 236 return _mm256_bslli_epi128(a, 3); 237 } 238 239 __m256i test_mm256_bsrli_epi128(__m256i a) { 240 // CHECK-LABEL: test_mm256_bsrli_epi128 241 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <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, i32 32, i32 33, i32 34, 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, i32 48, i32 49, i32 50> 242 return _mm256_bsrli_epi128(a, 3); 243 } 244 245 __m256i test_mm256_cmpeq_epi8(__m256i a, __m256i b) { 246 // CHECK-LABEL: test_mm256_cmpeq_epi8 247 // CHECK: icmp eq <32 x i8> 248 return _mm256_cmpeq_epi8(a, b); 249 } 250 251 __m256i test_mm256_cmpeq_epi16(__m256i a, __m256i b) { 252 // CHECK-LABEL: test_mm256_cmpeq_epi16 253 // CHECK: icmp eq <16 x i16> 254 return _mm256_cmpeq_epi16(a, b); 255 } 256 257 __m256i test_mm256_cmpeq_epi32(__m256i a, __m256i b) { 258 // CHECK-LABEL: test_mm256_cmpeq_epi32 259 // CHECK: icmp eq <8 x i32> 260 return _mm256_cmpeq_epi32(a, b); 261 } 262 263 __m256i test_mm256_cmpeq_epi64(__m256i a, __m256i b) { 264 // CHECK-LABEL: test_mm256_cmpeq_epi64 265 // CHECK: icmp eq <4 x i64> 266 return _mm256_cmpeq_epi64(a, b); 267 } 268 269 __m256i test_mm256_cmpgt_epi8(__m256i a, __m256i b) { 270 // CHECK-LABEL: test_mm256_cmpgt_epi8 271 // CHECK: icmp sgt <32 x i8> 272 return _mm256_cmpgt_epi8(a, b); 273 } 274 275 __m256i test_mm256_cmpgt_epi16(__m256i a, __m256i b) { 276 // CHECK-LABEL: test_mm256_cmpgt_epi16 277 // CHECK: icmp sgt <16 x i16> 278 return _mm256_cmpgt_epi16(a, b); 279 } 280 281 __m256i test_mm256_cmpgt_epi32(__m256i a, __m256i b) { 282 // CHECK-LABEL: test_mm256_cmpgt_epi32 283 // CHECK: icmp sgt <8 x i32> 284 return _mm256_cmpgt_epi32(a, b); 285 } 286 287 __m256i test_mm256_cmpgt_epi64(__m256i a, __m256i b) { 288 // CHECK-LABEL: test_mm256_cmpgt_epi64 289 // CHECK: icmp sgt <4 x i64> 290 return _mm256_cmpgt_epi64(a, b); 291 } 292 293 __m256i test_mm256_cvtepi8_epi16(__m128i a) { 294 // CHECK-LABEL: test_mm256_cvtepi8_epi16 295 // CHECK: sext <16 x i8> %{{.*}} to <16 x i16> 296 return _mm256_cvtepi8_epi16(a); 297 } 298 299 __m256i test_mm256_cvtepi8_epi32(__m128i a) { 300 // CHECK-LABEL: test_mm256_cvtepi8_epi32 301 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 302 // CHECK: sext <8 x i8> %{{.*}} to <8 x i32> 303 return _mm256_cvtepi8_epi32(a); 304 } 305 306 __m256i test_mm256_cvtepi8_epi64(__m128i a) { 307 // CHECK-LABEL: test_mm256_cvtepi8_epi64 308 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 309 // CHECK: sext <4 x i8> %{{.*}} to <4 x i64> 310 return _mm256_cvtepi8_epi64(a); 311 } 312 313 __m256i test_mm256_cvtepi16_epi32(__m128i a) { 314 // CHECK-LABEL: test_mm256_cvtepi16_epi32 315 // CHECK: sext <8 x i16> %{{.*}} to <8 x i32> 316 return _mm256_cvtepi16_epi32(a); 317 } 318 319 __m256i test_mm256_cvtepi16_epi64(__m128i a) { 320 // CHECK-LABEL: test_mm256_cvtepi16_epi64 321 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 322 // CHECK: sext <4 x i16> %{{.*}} to <4 x i64> 323 return _mm256_cvtepi16_epi64(a); 324 } 325 326 __m256i test_mm256_cvtepi32_epi64(__m128i a) { 327 // CHECK-LABEL: test_mm256_cvtepi32_epi64 328 // CHECK: sext <4 x i32> %{{.*}} to <4 x i64> 329 return _mm256_cvtepi32_epi64(a); 330 } 331 332 __m256i test_mm256_cvtepu8_epi16(__m128i a) { 333 // CHECK-LABEL: test_mm256_cvtepu8_epi16 334 // CHECK: zext <16 x i8> %{{.*}} to <16 x i16> 335 return _mm256_cvtepu8_epi16(a); 336 } 337 338 __m256i test_mm256_cvtepu8_epi32(__m128i a) { 339 // CHECK-LABEL: test_mm256_cvtepu8_epi32 340 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 341 // CHECK: zext <8 x i8> %{{.*}} to <8 x i32> 342 return _mm256_cvtepu8_epi32(a); 343 } 344 345 __m256i test_mm256_cvtepu8_epi64(__m128i a) { 346 // CHECK-LABEL: test_mm256_cvtepu8_epi64 347 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 348 // CHECK: zext <4 x i8> %{{.*}} to <4 x i64> 349 return _mm256_cvtepu8_epi64(a); 350 } 351 352 __m256i test_mm256_cvtepu16_epi32(__m128i a) { 353 // CHECK-LABEL: test_mm256_cvtepu16_epi32 354 // CHECK: zext <8 x i16> {{.*}} to <8 x i32> 355 return _mm256_cvtepu16_epi32(a); 356 } 357 358 __m256i test_mm256_cvtepu16_epi64(__m128i a) { 359 // CHECK-LABEL: test_mm256_cvtepu16_epi64 360 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 361 // CHECK: zext <4 x i16> %{{.*}} to <4 x i64> 362 return _mm256_cvtepu16_epi64(a); 363 } 364 365 __m256i test_mm256_cvtepu32_epi64(__m128i a) { 366 // CHECK-LABEL: test_mm256_cvtepu32_epi64 367 // CHECK: zext <4 x i32> %{{.*}} to <4 x i64> 368 return _mm256_cvtepu32_epi64(a); 369 } 370 371 __m128i test0_mm256_extracti128_si256_0(__m256i a) { 372 // CHECK-LABEL: test0_mm256_extracti128_si256 373 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1> 374 return _mm256_extracti128_si256(a, 0); 375 } 376 377 __m128i test1_mm256_extracti128_si256_1(__m256i a) { 378 // CHECK-LABEL: test1_mm256_extracti128_si256 379 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3> 380 return _mm256_extracti128_si256(a, 1); 381 } 382 383 // Immediate should be truncated to one bit. 384 __m128i test2_mm256_extracti128_si256(__m256i a) { 385 // CHECK-LABEL: test2_mm256_extracti128_si256 386 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1> 387 return _mm256_extracti128_si256(a, 2); 388 } 389 390 __m256i test_mm256_hadd_epi16(__m256i a, __m256i b) { 391 // CHECK-LABEL: test_mm256_hadd_epi16 392 // CHECK: call <16 x i16> @llvm.x86.avx2.phadd.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 393 return _mm256_hadd_epi16(a, b); 394 } 395 396 __m256i test_mm256_hadd_epi32(__m256i a, __m256i b) { 397 // CHECK-LABEL: test_mm256_hadd_epi32 398 // CHECK: call <8 x i32> @llvm.x86.avx2.phadd.d(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 399 return _mm256_hadd_epi32(a, b); 400 } 401 402 __m256i test_mm256_hadds_epi16(__m256i a, __m256i b) { 403 // CHECK-LABEL: test_mm256_hadds_epi16 404 // CHECK:call <16 x i16> @llvm.x86.avx2.phadd.sw(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 405 return _mm256_hadds_epi16(a, b); 406 } 407 408 __m256i test_mm256_hsub_epi16(__m256i a, __m256i b) { 409 // CHECK-LABEL: test_mm256_hsub_epi16 410 // CHECK: call <16 x i16> @llvm.x86.avx2.phsub.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 411 return _mm256_hsub_epi16(a, b); 412 } 413 414 __m256i test_mm256_hsub_epi32(__m256i a, __m256i b) { 415 // CHECK-LABEL: test_mm256_hsub_epi32 416 // CHECK: call <8 x i32> @llvm.x86.avx2.phsub.d(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 417 return _mm256_hsub_epi32(a, b); 418 } 419 420 __m256i test_mm256_hsubs_epi16(__m256i a, __m256i b) { 421 // CHECK-LABEL: test_mm256_hsubs_epi16 422 // CHECK:call <16 x i16> @llvm.x86.avx2.phsub.sw(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 423 return _mm256_hsubs_epi16(a, b); 424 } 425 426 __m128i test_mm_i32gather_epi32(int const *b, __m128i c) { 427 // CHECK-LABEL: test_mm_i32gather_epi32 428 // CHECK: call <4 x i32> @llvm.x86.avx2.gather.d.d(<4 x i32> %{{.*}}, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, i8 2) 429 return _mm_i32gather_epi32(b, c, 2); 430 } 431 432 __m128i test_mm_mask_i32gather_epi32(__m128i a, int const *b, __m128i c, __m128i d) { 433 // CHECK-LABEL: test_mm_mask_i32gather_epi32 434 // CHECK: call <4 x i32> @llvm.x86.avx2.gather.d.d(<4 x i32> %{{.*}}, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, i8 2) 435 return _mm_mask_i32gather_epi32(a, b, c, d, 2); 436 } 437 438 __m256i test_mm256_i32gather_epi32(int const *b, __m256i c) { 439 // CHECK-LABEL: test_mm256_i32gather_epi32 440 // CHECK: call <8 x i32> @llvm.x86.avx2.gather.d.d.256(<8 x i32> %{{.*}}, i8* %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, i8 2) 441 return _mm256_i32gather_epi32(b, c, 2); 442 } 443 444 __m256i test_mm256_mask_i32gather_epi32(__m256i a, int const *b, __m256i c, __m256i d) { 445 // CHECK-LABEL: test_mm256_mask_i32gather_epi32 446 // CHECK: call <8 x i32> @llvm.x86.avx2.gather.d.d.256(<8 x i32> %{{.*}}, i8* %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, i8 2) 447 return _mm256_mask_i32gather_epi32(a, b, c, d, 2); 448 } 449 450 __m128i test_mm_i32gather_epi64(long long const *b, __m128i c) { 451 // CHECK-LABEL: test_mm_i32gather_epi64 452 // CHECK: call <2 x i64> @llvm.x86.avx2.gather.d.q(<2 x i64> undef, i8* %{{.*}}, <4 x i32> %{{.*}}, <2 x i64> %{{.*}}, i8 2) 453 return _mm_i32gather_epi64(b, c, 2); 454 } 455 456 __m128i test_mm_mask_i32gather_epi64(__m128i a, long long const *b, __m128i c, __m128i d) { 457 // CHECK-LABEL: test_mm_mask_i32gather_epi64 458 // CHECK: call <2 x i64> @llvm.x86.avx2.gather.d.q(<2 x i64> %{{.*}}, i8* %{{.*}}, <4 x i32> %{{.*}}, <2 x i64> %{{.*}}, i8 2) 459 return _mm_mask_i32gather_epi64(a, b, c, d, 2); 460 } 461 462 __m256i test_mm256_i32gather_epi64(long long const *b, __m128i c) { 463 // CHECK-LABEL: test_mm256_i32gather_epi64 464 // CHECK: call <4 x i64> @llvm.x86.avx2.gather.d.q.256(<4 x i64> undef, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x i64> %{{.*}}, i8 2) 465 return _mm256_i32gather_epi64(b, c, 2); 466 } 467 468 __m256i test_mm256_mask_i32gather_epi64(__m256i a, long long const *b, __m128i c, __m256i d) { 469 // CHECK-LABEL: test_mm256_mask_i32gather_epi64 470 // CHECK: call <4 x i64> @llvm.x86.avx2.gather.d.q.256(<4 x i64> %{{.*}}, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x i64> %{{.*}}, i8 2) 471 return _mm256_mask_i32gather_epi64(a, b, c, d, 2); 472 } 473 474 __m128d test_mm_i32gather_pd(double const *b, __m128i c) { 475 // CHECK-LABEL: test_mm_i32gather_pd 476 // CHECK: [[CMP:%.*]] = fcmp oeq <2 x double> 477 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64> 478 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double> 479 // CHECK: call <2 x double> @llvm.x86.avx2.gather.d.pd(<2 x double> undef, i8* %{{.*}}, <4 x i32> %{{.*}}, <2 x double> %{{.*}}, i8 2) 480 return _mm_i32gather_pd(b, c, 2); 481 } 482 483 __m128d test_mm_mask_i32gather_pd(__m128d a, double const *b, __m128i c, __m128d d) { 484 // CHECK-LABEL: test_mm_mask_i32gather_pd 485 // CHECK: call <2 x double> @llvm.x86.avx2.gather.d.pd(<2 x double> %{{.*}}, i8* %{{.*}}, <4 x i32> %{{.*}}, <2 x double> %{{.*}}, i8 2) 486 return _mm_mask_i32gather_pd(a, b, c, d, 2); 487 } 488 489 __m256d test_mm256_i32gather_pd(double const *b, __m128i c) { 490 // CHECK-LABEL: test_mm256_i32gather_pd 491 // CHECK: [[CMP:%.*]] = fcmp oeq <4 x double> 492 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i64> 493 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i64> [[SEXT]] to <4 x double> 494 // CHECK: call <4 x double> @llvm.x86.avx2.gather.d.pd.256(<4 x double> undef, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x double> %{{.*}}, i8 2) 495 return _mm256_i32gather_pd(b, c, 2); 496 } 497 498 __m256d test_mm256_mask_i32gather_pd(__m256d a, double const *b, __m128i c, __m256d d) { 499 // CHECK-LABEL: test_mm256_mask_i32gather_pd 500 // CHECK: call <4 x double> @llvm.x86.avx2.gather.d.pd.256(<4 x double> %{{.*}}, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x double> %{{.*}}, i8 2) 501 return _mm256_mask_i32gather_pd(a, b, c, d, 2); 502 } 503 504 __m128 test_mm_i32gather_ps(float const *b, __m128i c) { 505 // CHECK-LABEL: test_mm_i32gather_ps 506 // CHECK: [[CMP:%.*]] = fcmp oeq <4 x float> 507 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 508 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float> 509 // CHECK: call <4 x float> @llvm.x86.avx2.gather.d.ps(<4 x float> undef, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x float> %{{.*}}, i8 2) 510 return _mm_i32gather_ps(b, c, 2); 511 } 512 513 __m128 test_mm_mask_i32gather_ps(__m128 a, float const *b, __m128i c, __m128 d) { 514 // CHECK-LABEL: test_mm_mask_i32gather_ps 515 // CHECK: call <4 x float> @llvm.x86.avx2.gather.d.ps(<4 x float> %{{.*}}, i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x float> %{{.*}}, i8 2) 516 return _mm_mask_i32gather_ps(a, b, c, d, 2); 517 } 518 519 __m256 test_mm256_i32gather_ps(float const *b, __m256i c) { 520 // CHECK-LABEL: test_mm256_i32gather_ps 521 // CHECK: [[CMP:%.*]] = fcmp oeq <8 x float> 522 // CHECK-NEXT: [[SEXT:%.*]] = sext <8 x i1> [[CMP]] to <8 x i32> 523 // CHECK-NEXT: [[BC:%.*]] = bitcast <8 x i32> [[SEXT]] to <8 x float> 524 // CHECK: call <8 x float> @llvm.x86.avx2.gather.d.ps.256(<8 x float> undef, i8* %{{.*}}, <8 x i32> %{{.*}}, <8 x float> %{{.*}}, i8 2) 525 return _mm256_i32gather_ps(b, c, 2); 526 } 527 528 __m256 test_mm256_mask_i32gather_ps(__m256 a, float const *b, __m256i c, __m256 d) { 529 // CHECK-LABEL: test_mm256_mask_i32gather_ps 530 // CHECK: call <8 x float> @llvm.x86.avx2.gather.d.ps.256(<8 x float> %{{.*}}, i8* %{{.*}}, <8 x i32> %{{.*}}, <8 x float> %{{.*}}, i8 2) 531 return _mm256_mask_i32gather_ps(a, b, c, d, 2); 532 } 533 534 __m128i test_mm_i64gather_epi32(int const *b, __m128i c) { 535 // CHECK-LABEL: test_mm_i64gather_epi32 536 // CHECK: call <4 x i32> @llvm.x86.avx2.gather.q.d(<4 x i32> %{{.*}}, i8* %{{.*}}, <2 x i64> %{{.*}}, <4 x i32> %{{.*}}, i8 2) 537 return _mm_i64gather_epi32(b, c, 2); 538 } 539 540 __m128i test_mm_mask_i64gather_epi32(__m128i a, int const *b, __m128i c, __m128i d) { 541 // CHECK-LABEL: test_mm_mask_i64gather_epi32 542 // CHECK: call <4 x i32> @llvm.x86.avx2.gather.q.d(<4 x i32> %{{.*}}, i8* %{{.*}}, <2 x i64> %{{.*}}, <4 x i32> %{{.*}}, i8 2) 543 return _mm_mask_i64gather_epi32(a, b, c, d, 2); 544 } 545 546 __m128i test_mm256_i64gather_epi32(int const *b, __m256i c) { 547 // CHECK-LABEL: test_mm256_i64gather_epi32 548 // CHECK: call <4 x i32> @llvm.x86.avx2.gather.q.d.256(<4 x i32> %{{.*}}, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> %{{.*}}, i8 2) 549 return _mm256_i64gather_epi32(b, c, 2); 550 } 551 552 __m128i test_mm256_mask_i64gather_epi32(__m128i a, int const *b, __m256i c, __m128i d) { 553 // CHECK-LABEL: test_mm256_mask_i64gather_epi32 554 // CHECK: call <4 x i32> @llvm.x86.avx2.gather.q.d.256(<4 x i32> %{{.*}}, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> %{{.*}}, i8 2) 555 return _mm256_mask_i64gather_epi32(a, b, c, d, 2); 556 } 557 558 __m128i test_mm_i64gather_epi64(long long const *b, __m128i c) { 559 // CHECK-LABEL: test_mm_i64gather_epi64 560 // CHECK: call <2 x i64> @llvm.x86.avx2.gather.q.q(<2 x i64> undef, i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i8 2) 561 return _mm_i64gather_epi64(b, c, 2); 562 } 563 564 __m128i test_mm_mask_i64gather_epi64(__m128i a, long long const *b, __m128i c, __m128i d) { 565 // CHECK-LABEL: test_mm_mask_i64gather_epi64 566 // CHECK: call <2 x i64> @llvm.x86.avx2.gather.q.q(<2 x i64> %{{.*}}, i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i8 2) 567 return _mm_mask_i64gather_epi64(a, b, c, d, 2); 568 } 569 570 __m256i test_mm256_i64gather_epi64(long long const *b, __m256i c) { 571 // CHECK-LABEL: test_mm256_i64gather_epi64 572 // CHECK: call <4 x i64> @llvm.x86.avx2.gather.q.q.256(<4 x i64> undef, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, i8 2) 573 return _mm256_i64gather_epi64(b, c, 2); 574 } 575 576 __m256i test_mm256_mask_i64gather_epi64(__m256i a, long long const *b, __m256i c, __m256i d) { 577 // CHECK-LABEL: test_mm256_mask_i64gather_epi64 578 // CHECK: call <4 x i64> @llvm.x86.avx2.gather.q.q.256(<4 x i64> %{{.*}}, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, i8 2) 579 return _mm256_mask_i64gather_epi64(a, b, c, d, 2); 580 } 581 582 __m128d test_mm_i64gather_pd(double const *b, __m128i c) { 583 // CHECK-LABEL: test_mm_i64gather_pd 584 // CHECK: [[CMP:%.*]] = fcmp oeq <2 x double> 585 // CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i64> 586 // CHECK-NEXT: [[BC:%.*]] = bitcast <2 x i64> [[SEXT]] to <2 x double> 587 // CHECK: call <2 x double> @llvm.x86.avx2.gather.q.pd(<2 x double> undef, i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x double> %{{.*}}, i8 2) 588 return _mm_i64gather_pd(b, c, 2); 589 } 590 591 __m128d test_mm_mask_i64gather_pd(__m128d a, double const *b, __m128i c, __m128d d) { 592 // CHECK-LABEL: test_mm_mask_i64gather_pd 593 // CHECK: call <2 x double> @llvm.x86.avx2.gather.q.pd(<2 x double> %{{.*}}, i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x double> %{{.*}}, i8 2) 594 return _mm_mask_i64gather_pd(a, b, c, d, 2); 595 } 596 597 __m256d test_mm256_i64gather_pd(double const *b, __m256i c) { 598 // CHECK-LABEL: test_mm256_i64gather_pd 599 // CHECK: [[CMP:%.*]] = fcmp oeq <4 x double> 600 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i64> 601 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i64> [[SEXT]] to <4 x double> 602 // CHECK: call <4 x double> @llvm.x86.avx2.gather.q.pd.256(<4 x double> undef, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x double> %{{.*}}, i8 2) 603 return _mm256_i64gather_pd(b, c, 2); 604 } 605 606 __m256d test_mm256_mask_i64gather_pd(__m256d a, double const *b, __m256i c, __m256d d) { 607 // CHECK-LABEL: test_mm256_mask_i64gather_pd 608 // CHECK: call <4 x double> @llvm.x86.avx2.gather.q.pd.256(<4 x double> %{{.*}}, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x double> %{{.*}}, i8 2) 609 return _mm256_mask_i64gather_pd(a, b, c, d, 2); 610 } 611 612 __m128 test_mm_i64gather_ps(float const *b, __m128i c) { 613 // CHECK-LABEL: test_mm_i64gather_ps 614 // CHECK: [[CMP:%.*]] = fcmp oeq <4 x float> 615 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 616 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float> 617 // CHECK: call <4 x float> @llvm.x86.avx2.gather.q.ps(<4 x float> undef, i8* %{{.*}}, <2 x i64> %{{.*}}, <4 x float> %{{.*}}, i8 2) 618 return _mm_i64gather_ps(b, c, 2); 619 } 620 621 __m128 test_mm_mask_i64gather_ps(__m128 a, float const *b, __m128i c, __m128 d) { 622 // CHECK-LABEL: test_mm_mask_i64gather_ps 623 // CHECK: call <4 x float> @llvm.x86.avx2.gather.q.ps(<4 x float> %{{.*}}, i8* %{{.*}}, <2 x i64> %{{.*}}, <4 x float> %{{.*}}, i8 2) 624 return _mm_mask_i64gather_ps(a, b, c, d, 2); 625 } 626 627 __m128 test_mm256_i64gather_ps(float const *b, __m256i c) { 628 // CHECK-LABEL: test_mm256_i64gather_ps 629 // CHECK: [[CMP:%.*]] = fcmp oeq <4 x float> 630 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 631 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float> 632 // CHECK: call <4 x float> @llvm.x86.avx2.gather.q.ps.256(<4 x float> undef, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x float> %{{.*}}, i8 2) 633 return _mm256_i64gather_ps(b, c, 2); 634 } 635 636 __m128 test_mm256_mask_i64gather_ps(__m128 a, float const *b, __m256i c, __m128 d) { 637 // CHECK-LABEL: test_mm256_mask_i64gather_ps 638 // CHECK: call <4 x float> @llvm.x86.avx2.gather.q.ps.256(<4 x float> %{{.*}}, i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x float> %{{.*}}, i8 2) 639 return _mm256_mask_i64gather_ps(a, b, c, d, 2); 640 } 641 642 __m256i test0_mm256_inserti128_si256(__m256i a, __m128i b) { 643 // CHECK-LABEL: test0_mm256_inserti128_si256 644 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 645 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> <i32 4, i32 5, i32 2, i32 3> 646 return _mm256_inserti128_si256(a, b, 0); 647 } 648 649 __m256i test1_mm256_inserti128_si256(__m256i a, __m128i b) { 650 // CHECK-LABEL: test1_mm256_inserti128_si256 651 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 652 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 4, i32 5> 653 return _mm256_inserti128_si256(a, b, 1); 654 } 655 656 // Immediate should be truncated to one bit. 657 __m256i test2_mm256_inserti128_si256(__m256i a, __m128i b) { 658 // CHECK-LABEL: test2_mm256_inserti128_si256 659 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 660 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> <i32 4, i32 5, i32 2, i32 3> 661 return _mm256_inserti128_si256(a, b, 2); 662 } 663 664 __m256i test_mm256_madd_epi16(__m256i a, __m256i b) { 665 // CHECK-LABEL: test_mm256_madd_epi16 666 // CHECK: call <8 x i32> @llvm.x86.avx2.pmadd.wd(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 667 return _mm256_madd_epi16(a, b); 668 } 669 670 __m256i test_mm256_maddubs_epi16(__m256i a, __m256i b) { 671 // CHECK-LABEL: test_mm256_maddubs_epi16 672 // CHECK: call <16 x i16> @llvm.x86.avx2.pmadd.ub.sw(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 673 return _mm256_maddubs_epi16(a, b); 674 } 675 676 __m128i test_mm_maskload_epi32(int const *a, __m128i m) { 677 // CHECK-LABEL: test_mm_maskload_epi32 678 // CHECK: call <4 x i32> @llvm.x86.avx2.maskload.d(i8* %{{.*}}, <4 x i32> %{{.*}}) 679 return _mm_maskload_epi32(a, m); 680 } 681 682 __m256i test_mm256_maskload_epi32(int const *a, __m256i m) { 683 // CHECK-LABEL: test_mm256_maskload_epi32 684 // CHECK: call <8 x i32> @llvm.x86.avx2.maskload.d.256(i8* %{{.*}}, <8 x i32> %{{.*}}) 685 return _mm256_maskload_epi32(a, m); 686 } 687 688 __m128i test_mm_maskload_epi64(long long const *a, __m128i m) { 689 // CHECK-LABEL: test_mm_maskload_epi64 690 // CHECK: call <2 x i64> @llvm.x86.avx2.maskload.q(i8* %{{.*}}, <2 x i64> %{{.*}}) 691 return _mm_maskload_epi64(a, m); 692 } 693 694 __m256i test_mm256_maskload_epi64(long long const *a, __m256i m) { 695 // CHECK-LABEL: test_mm256_maskload_epi64 696 // CHECK: call <4 x i64> @llvm.x86.avx2.maskload.q.256(i8* %{{.*}}, <4 x i64> %{{.*}}) 697 return _mm256_maskload_epi64(a, m); 698 } 699 700 void test_mm_maskstore_epi32(int *a, __m128i m, __m128i b) { 701 // CHECK-LABEL: test_mm_maskstore_epi32 702 // CHECK: call void @llvm.x86.avx2.maskstore.d(i8* %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}) 703 _mm_maskstore_epi32(a, m, b); 704 } 705 706 void test_mm256_maskstore_epi32(int *a, __m256i m, __m256i b) { 707 // CHECK-LABEL: test_mm256_maskstore_epi32 708 // CHECK: call void @llvm.x86.avx2.maskstore.d.256(i8* %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 709 _mm256_maskstore_epi32(a, m, b); 710 } 711 712 void test_mm_maskstore_epi64(long long *a, __m128i m, __m128i b) { 713 // CHECK-LABEL: test_mm_maskstore_epi64 714 // CHECK: call void @llvm.x86.avx2.maskstore.q(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}) 715 _mm_maskstore_epi64(a, m, b); 716 } 717 718 void test_mm256_maskstore_epi64(long long *a, __m256i m, __m256i b) { 719 // CHECK-LABEL: test_mm256_maskstore_epi64 720 // CHECK: call void @llvm.x86.avx2.maskstore.q.256(i8* %{{.*}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}) 721 _mm256_maskstore_epi64(a, m, b); 722 } 723 724 __m256i test_mm256_max_epi8(__m256i a, __m256i b) { 725 // CHECK-LABEL: test_mm256_max_epi8 726 // CHECK: [[CMP:%.*]] = icmp sgt <32 x i8> [[X:%.*]], [[Y:%.*]] 727 // CHECK-NEXT: select <32 x i1> [[CMP]], <32 x i8> [[X]], <32 x i8> [[Y]] 728 return _mm256_max_epi8(a, b); 729 } 730 731 __m256i test_mm256_max_epi16(__m256i a, __m256i b) { 732 // CHECK-LABEL: test_mm256_max_epi16 733 // CHECK: [[CMP:%.*]] = icmp sgt <16 x i16> [[X:%.*]], [[Y:%.*]] 734 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i16> [[X]], <16 x i16> [[Y]] 735 return _mm256_max_epi16(a, b); 736 } 737 738 __m256i test_mm256_max_epi32(__m256i a, __m256i b) { 739 // CHECK-LABEL: test_mm256_max_epi32 740 // CHECK: [[CMP:%.*]] = icmp sgt <8 x i32> [[X:%.*]], [[Y:%.*]] 741 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i32> [[X]], <8 x i32> [[Y]] 742 return _mm256_max_epi32(a, b); 743 } 744 745 __m256i test_mm256_max_epu8(__m256i a, __m256i b) { 746 // CHECK-LABEL: test_mm256_max_epu8 747 // CHECK: [[CMP:%.*]] = icmp ugt <32 x i8> [[X:%.*]], [[Y:%.*]] 748 // CHECK-NEXT: select <32 x i1> [[CMP]], <32 x i8> [[X]], <32 x i8> [[Y]] 749 return _mm256_max_epu8(a, b); 750 } 751 752 __m256i test_mm256_max_epu16(__m256i a, __m256i b) { 753 // CHECK-LABEL: test_mm256_max_epu16 754 // CHECK: [[CMP:%.*]] = icmp ugt <16 x i16> [[X:%.*]], [[Y:%.*]] 755 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i16> [[X]], <16 x i16> [[Y]] 756 return _mm256_max_epu16(a, b); 757 } 758 759 __m256i test_mm256_max_epu32(__m256i a, __m256i b) { 760 // CHECK-LABEL: test_mm256_max_epu32 761 // CHECK: [[CMP:%.*]] = icmp ugt <8 x i32> [[X:%.*]], [[Y:%.*]] 762 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i32> [[X]], <8 x i32> [[Y]] 763 return _mm256_max_epu32(a, b); 764 } 765 766 __m256i test_mm256_min_epi8(__m256i a, __m256i b) { 767 // CHECK-LABEL: test_mm256_min_epi8 768 // CHECK: [[CMP:%.*]] = icmp slt <32 x i8> [[X:%.*]], [[Y:%.*]] 769 // CHECK-NEXT: select <32 x i1> [[CMP]], <32 x i8> [[X]], <32 x i8> [[Y]] 770 return _mm256_min_epi8(a, b); 771 } 772 773 __m256i test_mm256_min_epi16(__m256i a, __m256i b) { 774 // CHECK-LABEL: test_mm256_min_epi16 775 // CHECK: [[CMP:%.*]] = icmp slt <16 x i16> [[X:%.*]], [[Y:%.*]] 776 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i16> [[X]], <16 x i16> [[Y]] 777 return _mm256_min_epi16(a, b); 778 } 779 780 __m256i test_mm256_min_epi32(__m256i a, __m256i b) { 781 // CHECK-LABEL: test_mm256_min_epi32 782 // CHECK: [[CMP:%.*]] = icmp slt <8 x i32> [[X:%.*]], [[Y:%.*]] 783 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i32> [[X]], <8 x i32> [[Y]] 784 return _mm256_min_epi32(a, b); 785 } 786 787 __m256i test_mm256_min_epu8(__m256i a, __m256i b) { 788 // CHECK-LABEL: test_mm256_min_epu8 789 // CHECK: [[CMP:%.*]] = icmp ult <32 x i8> [[X:%.*]], [[Y:%.*]] 790 // CHECK-NEXT: select <32 x i1> [[CMP]], <32 x i8> [[X]], <32 x i8> [[Y]] 791 return _mm256_min_epu8(a, b); 792 } 793 794 __m256i test_mm256_min_epu16(__m256i a, __m256i b) { 795 // CHECK-LABEL: test_mm256_min_epu16 796 // CHECK: [[CMP:%.*]] = icmp ult <16 x i16> [[X:%.*]], [[Y:%.*]] 797 // CHECK-NEXT: select <16 x i1> [[CMP]], <16 x i16> [[X]], <16 x i16> [[Y]] 798 return _mm256_min_epu16(a, b); 799 } 800 801 __m256i test_mm256_min_epu32(__m256i a, __m256i b) { 802 // CHECK-LABEL: test_mm256_min_epu32 803 // CHECK: [[CMP:%.*]] = icmp ult <8 x i32> [[X:%.*]], [[Y:%.*]] 804 // CHECK-NEXT: select <8 x i1> [[CMP]], <8 x i32> [[X]], <8 x i32> [[Y]] 805 return _mm256_min_epu32(a, b); 806 } 807 808 int test_mm256_movemask_epi8(__m256i a) { 809 // CHECK-LABEL: test_mm256_movemask_epi8 810 // CHECK: call i32 @llvm.x86.avx2.pmovmskb(<32 x i8> %{{.*}}) 811 return _mm256_movemask_epi8(a); 812 } 813 814 __m256i test_mm256_mpsadbw_epu8(__m256i x, __m256i y) { 815 // CHECK-LABEL: test_mm256_mpsadbw_epu8 816 // CHECK: call <16 x i16> @llvm.x86.avx2.mpsadbw(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}, i8 3) 817 return _mm256_mpsadbw_epu8(x, y, 3); 818 } 819 820 __m256i test_mm256_mul_epi32(__m256i a, __m256i b) { 821 // CHECK-LABEL: test_mm256_mul_epi32 822 // CHECK: call <4 x i64> @llvm.x86.avx2.pmul.dq(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 823 return _mm256_mul_epi32(a, b); 824 } 825 826 __m256i test_mm256_mul_epu32(__m256i a, __m256i b) { 827 // CHECK-LABEL: test_mm256_mul_epu32 828 // CHECK: call <4 x i64> @llvm.x86.avx2.pmulu.dq(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 829 return _mm256_mul_epu32(a, b); 830 } 831 832 __m256i test_mm256_mulhi_epu16(__m256i a, __m256i b) { 833 // CHECK-LABEL: test_mm256_mulhi_epu16 834 // CHECK: call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 835 return _mm256_mulhi_epu16(a, b); 836 } 837 838 __m256i test_mm256_mulhi_epi16(__m256i a, __m256i b) { 839 // CHECK-LABEL: test_mm256_mulhi_epi16 840 // CHECK: call <16 x i16> @llvm.x86.avx2.pmulh.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 841 return _mm256_mulhi_epi16(a, b); 842 } 843 844 __m256i test_mm256_mulhrs_epi16(__m256i a, __m256i b) { 845 // CHECK-LABEL: test_mm256_mulhrs_epi16 846 // CHECK: call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 847 return _mm256_mulhrs_epi16(a, b); 848 } 849 850 __m256i test_mm256_mullo_epi16(__m256i a, __m256i b) { 851 // CHECK-LABEL: test_mm256_mullo_epi16 852 // CHECK: mul <16 x i16> 853 return _mm256_mullo_epi16(a, b); 854 } 855 856 __m256i test_mm256_mullo_epi32(__m256i a, __m256i b) { 857 // CHECK-LABEL: test_mm256_mullo_epi32 858 // CHECK: mul <8 x i32> 859 return _mm256_mullo_epi32(a, b); 860 } 861 862 __m256i test_mm256_or_si256(__m256i a, __m256i b) { 863 // CHECK-LABEL: test_mm256_or_si256 864 // CHECK: or <4 x i64> 865 return _mm256_or_si256(a, b); 866 } 867 868 __m256i test_mm256_packs_epi16(__m256i a, __m256i b) { 869 // CHECK-LABEL: test_mm256_packs_epi16 870 // CHECK: call <32 x i8> @llvm.x86.avx2.packsswb(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 871 return _mm256_packs_epi16(a, b); 872 } 873 874 __m256i test_mm256_packs_epi32(__m256i a, __m256i b) { 875 // CHECK-LABEL: test_mm256_packs_epi32 876 // CHECK: call <16 x i16> @llvm.x86.avx2.packssdw(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 877 return _mm256_packs_epi32(a, b); 878 } 879 880 __m256i test_mm256_packs_epu16(__m256i a, __m256i b) { 881 // CHECK-LABEL: test_mm256_packs_epu16 882 // CHECK: call <32 x i8> @llvm.x86.avx2.packuswb(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 883 return _mm256_packus_epi16(a, b); 884 } 885 886 __m256i test_mm256_packs_epu32(__m256i a, __m256i b) { 887 // CHECK-LABEL: test_mm256_packs_epu32 888 // CHECK: call <16 x i16> @llvm.x86.avx2.packusdw(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 889 return _mm256_packus_epi32(a, b); 890 } 891 892 __m256i test_mm256_permute2x128_si256(__m256i a, __m256i b) { 893 // CHECK-LABEL: test_mm256_permute2x128_si256 894 // CHECK: call <4 x i64> @llvm.x86.avx2.vperm2i128(<4 x i64> %{{.*}}, <4 x i64> %{{.*}}, i8 49) 895 return _mm256_permute2x128_si256(a, b, 0x31); 896 } 897 898 __m256i test_mm256_permute4x64_epi64(__m256i a) { 899 // CHECK-LABEL: test_mm256_permute4x64_epi64 900 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 0> 901 return _mm256_permute4x64_epi64(a, 35); 902 } 903 904 __m256d test_mm256_permute4x64_pd(__m256d a) { 905 // CHECK-LABEL: test_mm256_permute4x64_pd 906 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <4 x i32> <i32 1, i32 2, i32 1, i32 0> 907 return _mm256_permute4x64_pd(a, 25); 908 } 909 910 __m256i test_mm256_permutevar8x32_epi32(__m256i a, __m256i b) { 911 // CHECK-LABEL: test_mm256_permutevar8x32_epi32 912 // CHECK: call <8 x i32> @llvm.x86.avx2.permd(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 913 return _mm256_permutevar8x32_epi32(a, b); 914 } 915 916 __m256 test_mm256_permutevar8x32_ps(__m256 a, __m256i b) { 917 // CHECK-LABEL: test_mm256_permutevar8x32_ps 918 // CHECK: call <8 x float> @llvm.x86.avx2.permps(<8 x float> %{{.*}}, <8 x i32> %{{.*}}) 919 return _mm256_permutevar8x32_ps(a, b); 920 } 921 922 __m256i test_mm256_sad_epu8(__m256i x, __m256i y) { 923 // CHECK-LABEL: test_mm256_sad_epu8 924 // CHECK: call <4 x i64> @llvm.x86.avx2.psad.bw(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 925 return _mm256_sad_epu8(x, y); 926 } 927 928 __m256i test_mm256_shuffle_epi8(__m256i a, __m256i b) { 929 // CHECK-LABEL: test_mm256_shuffle_epi8 930 // CHECK: call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 931 return _mm256_shuffle_epi8(a, b); 932 } 933 934 __m256i test_mm256_shuffle_epi32(__m256i a) { 935 // CHECK-LABEL: test_mm256_shuffle_epi32 936 // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 3, i32 3, i32 0, i32 0, i32 7, i32 7, i32 4, i32 4> 937 return _mm256_shuffle_epi32(a, 15); 938 } 939 940 __m256i test_mm256_shufflehi_epi16(__m256i a) { 941 // CHECK-LABEL: test_mm256_shufflehi_epi16 942 // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 7, i32 6, i32 6, i32 5, i32 8, i32 9, i32 10, i32 11, i32 15, i32 14, i32 14, i32 13> 943 return _mm256_shufflehi_epi16(a, 107); 944 } 945 946 __m256i test_mm256_shufflelo_epi16(__m256i a) { 947 // CHECK-LABEL: test_mm256_shufflelo_epi16 948 // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 3, i32 0, i32 1, i32 1, i32 4, i32 5, i32 6, i32 7, i32 11, i32 8, i32 9, i32 9, i32 12, i32 13, i32 14, i32 15> 949 return _mm256_shufflelo_epi16(a, 83); 950 } 951 952 __m256i test_mm256_sign_epi8(__m256i a, __m256i b) { 953 // CHECK-LABEL: test_mm256_sign_epi8 954 // CHECK: call <32 x i8> @llvm.x86.avx2.psign.b(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 955 return _mm256_sign_epi8(a, b); 956 } 957 958 __m256i test_mm256_sign_epi16(__m256i a, __m256i b) { 959 // CHECK-LABEL: test_mm256_sign_epi16 960 // CHECK: call <16 x i16> @llvm.x86.avx2.psign.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 961 return _mm256_sign_epi16(a, b); 962 } 963 964 __m256i test_mm256_sign_epi32(__m256i a, __m256i b) { 965 // CHECK-LABEL: test_mm256_sign_epi32 966 // CHECK: call <8 x i32> @llvm.x86.avx2.psign.d(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 967 return _mm256_sign_epi32(a, b); 968 } 969 970 __m256i test_mm256_slli_epi16(__m256i a) { 971 // CHECK-LABEL: test_mm256_slli_epi16 972 // CHECK: call <16 x i16> @llvm.x86.avx2.pslli.w(<16 x i16> %{{.*}}, i32 %{{.*}}) 973 return _mm256_slli_epi16(a, 3); 974 } 975 976 __m256i test_mm256_slli_epi32(__m256i a) { 977 // CHECK-LABEL: test_mm256_slli_epi32 978 // CHECK: call <8 x i32> @llvm.x86.avx2.pslli.d(<8 x i32> %{{.*}}, i32 %{{.*}}) 979 return _mm256_slli_epi32(a, 3); 980 } 981 982 __m256i test_mm256_slli_epi64(__m256i a) { 983 // CHECK-LABEL: test_mm256_slli_epi64 984 // CHECK: call <4 x i64> @llvm.x86.avx2.pslli.q(<4 x i64> %{{.*}}, i32 %{{.*}}) 985 return _mm256_slli_epi64(a, 3); 986 } 987 988 __m256i test_mm256_slli_si256(__m256i a) { 989 // CHECK-LABEL: test_mm256_slli_si256 990 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <i32 13, i32 14, i32 15, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 29, i32 30, i32 31, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60> 991 return _mm256_slli_si256(a, 3); 992 } 993 994 __m128i test_mm_sllv_epi32(__m128i a, __m128i b) { 995 // CHECK-LABEL: test_mm_sllv_epi32 996 // CHECK: call <4 x i32> @llvm.x86.avx2.psllv.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) 997 return _mm_sllv_epi32(a, b); 998 } 999 1000 __m256i test_mm256_sllv_epi32(__m256i a, __m256i b) { 1001 // CHECK-LABEL: test_mm256_sllv_epi32 1002 // CHECK: call <8 x i32> @llvm.x86.avx2.psllv.d.256(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 1003 return _mm256_sllv_epi32(a, b); 1004 } 1005 1006 __m128i test_mm_sllv_epi64(__m128i a, __m128i b) { 1007 // CHECK-LABEL: test_mm_sllv_epi64 1008 // CHECK: call <2 x i64> @llvm.x86.avx2.psllv.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}) 1009 return _mm_sllv_epi64(a, b); 1010 } 1011 1012 __m256i test_mm256_sllv_epi64(__m256i a, __m256i b) { 1013 // CHECK-LABEL: test_mm256_sllv_epi64 1014 // CHECK: call <4 x i64> @llvm.x86.avx2.psllv.q.256(<4 x i64> %{{.*}}, <4 x i64> %{{.*}}) 1015 return _mm256_sllv_epi64(a, b); 1016 } 1017 1018 __m256i test_mm256_sra_epi16(__m256i a, __m128i b) { 1019 // CHECK-LABEL: test_mm256_sra_epi16 1020 // CHECK: call <16 x i16> @llvm.x86.avx2.psra.w(<16 x i16> %{{.*}}, <8 x i16> %{{.*}}) 1021 return _mm256_sra_epi16(a, b); 1022 } 1023 1024 __m256i test_mm256_sra_epi32(__m256i a, __m128i b) { 1025 // CHECK-LABEL: test_mm256_sra_epi32 1026 // CHECK: call <8 x i32> @llvm.x86.avx2.psra.d(<8 x i32> %{{.*}}, <4 x i32> %{{.*}}) 1027 return _mm256_sra_epi32(a, b); 1028 } 1029 1030 __m256i test_mm256_srai_epi16(__m256i a) { 1031 // CHECK-LABEL: test_mm256_srai_epi16 1032 // CHECK: call <16 x i16> @llvm.x86.avx2.psrai.w(<16 x i16> %{{.*}}, i32 %{{.*}}) 1033 return _mm256_srai_epi16(a, 3); 1034 } 1035 1036 __m256i test_mm256_srai_epi32(__m256i a) { 1037 // CHECK-LABEL: test_mm256_srai_epi32 1038 // CHECK: call <8 x i32> @llvm.x86.avx2.psrai.d(<8 x i32> %{{.*}}, i32 %{{.*}}) 1039 return _mm256_srai_epi32(a, 3); 1040 } 1041 1042 __m128i test_mm_srav_epi32(__m128i a, __m128i b) { 1043 // CHECK-LABEL: test_mm_srav_epi32 1044 // CHECK: call <4 x i32> @llvm.x86.avx2.psrav.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) 1045 return _mm_srav_epi32(a, b); 1046 } 1047 1048 __m256i test_mm256_srav_epi32(__m256i a, __m256i b) { 1049 // CHECK-LABEL: test_mm256_srav_epi32 1050 // CHECK: call <8 x i32> @llvm.x86.avx2.psrav.d.256(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 1051 return _mm256_srav_epi32(a, b); 1052 } 1053 1054 __m256i test_mm256_srl_epi16(__m256i a, __m128i b) { 1055 // CHECK-LABEL: test_mm256_srl_epi16 1056 // CHECK: call <16 x i16> @llvm.x86.avx2.psrl.w(<16 x i16> %{{.*}}, <8 x i16> %{{.*}}) 1057 return _mm256_srl_epi16(a, b); 1058 } 1059 1060 __m256i test_mm256_srl_epi32(__m256i a, __m128i b) { 1061 // CHECK-LABEL: test_mm256_srl_epi32 1062 // CHECK:call <8 x i32> @llvm.x86.avx2.psrl.d(<8 x i32> %{{.*}}, <4 x i32> %{{.*}}) 1063 return _mm256_srl_epi32(a, b); 1064 } 1065 1066 __m256i test_mm256_srl_epi64(__m256i a, __m128i b) { 1067 // CHECK-LABEL: test_mm256_srl_epi64 1068 // CHECK: call <4 x i64> @llvm.x86.avx2.psrl.q(<4 x i64> %{{.*}}, <2 x i64> %{{.*}}) 1069 return _mm256_srl_epi64(a, b); 1070 } 1071 1072 __m256i test_mm256_srli_epi16(__m256i a) { 1073 // CHECK-LABEL: test_mm256_srli_epi16 1074 // CHECK: call <16 x i16> @llvm.x86.avx2.psrli.w(<16 x i16> %{{.*}}, i32 %{{.*}}) 1075 return _mm256_srli_epi16(a, 3); 1076 } 1077 1078 __m256i test_mm256_srli_epi32(__m256i a) { 1079 // CHECK-LABEL: test_mm256_srli_epi32 1080 // CHECK: call <8 x i32> @llvm.x86.avx2.psrli.d(<8 x i32> %{{.*}}, i32 %{{.*}}) 1081 return _mm256_srli_epi32(a, 3); 1082 } 1083 1084 __m256i test_mm256_srli_epi64(__m256i a) { 1085 // CHECK-LABEL: test_mm256_srli_epi64 1086 // CHECK: call <4 x i64> @llvm.x86.avx2.psrli.q(<4 x i64> %{{.*}}, i32 %{{.*}}) 1087 return _mm256_srli_epi64(a, 3); 1088 } 1089 1090 __m256i test_mm256_srli_si256(__m256i a) { 1091 // CHECK-LABEL: test_mm256_srli_si256 1092 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <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, i32 32, i32 33, i32 34, 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, i32 48, i32 49, i32 50> 1093 return _mm256_srli_si256(a, 3); 1094 } 1095 1096 __m128i test_mm_srlv_epi32(__m128i a, __m128i b) { 1097 // CHECK-LABEL: test_mm_srlv_epi32 1098 // CHECK: call <4 x i32> @llvm.x86.avx2.psrlv.d(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) 1099 return _mm_srlv_epi32(a, b); 1100 } 1101 1102 __m256i test_mm256_srlv_epi32(__m256i a, __m256i b) { 1103 // CHECK-LABEL: test_mm256_srlv_epi32 1104 // CHECK: call <8 x i32> @llvm.x86.avx2.psrlv.d.256(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) 1105 return _mm256_srlv_epi32(a, b); 1106 } 1107 1108 __m128i test_mm_srlv_epi64(__m128i a, __m128i b) { 1109 // CHECK-LABEL: test_mm_srlv_epi64 1110 // CHECK: call <2 x i64> @llvm.x86.avx2.psrlv.q(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}) 1111 return _mm_srlv_epi64(a, b); 1112 } 1113 1114 __m256i test_mm256_srlv_epi64(__m256i a, __m256i b) { 1115 // CHECK-LABEL: test_mm256_srlv_epi64 1116 // CHECK: call <4 x i64> @llvm.x86.avx2.psrlv.q.256(<4 x i64> %{{.*}}, <4 x i64> %{{.*}}) 1117 return _mm256_srlv_epi64(a, b); 1118 } 1119 1120 __m256i test_mm256_stream_load_si256(__m256i const *a) { 1121 // CHECK-LABEL: test_mm256_stream_load_si256 1122 // CHECK: call <4 x i64> @llvm.x86.avx2.movntdqa(i8* %{{.*}}) 1123 return _mm256_stream_load_si256(a); 1124 } 1125 1126 __m256i test_mm256_sub_epi8(__m256i a, __m256i b) { 1127 // CHECK-LABEL: test_mm256_sub_epi8 1128 // CHECK: sub <32 x i8> 1129 return _mm256_sub_epi8(a, b); 1130 } 1131 1132 __m256i test_mm256_sub_epi16(__m256i a, __m256i b) { 1133 // CHECK-LABEL: test_mm256_sub_epi16 1134 // CHECK: sub <16 x i16> 1135 return _mm256_sub_epi16(a, b); 1136 } 1137 1138 __m256i test_mm256_sub_epi32(__m256i a, __m256i b) { 1139 // CHECK-LABEL: test_mm256_sub_epi32 1140 // CHECK: sub <8 x i32> 1141 return _mm256_sub_epi32(a, b); 1142 } 1143 1144 __m256i test_mm256_sub_epi64(__m256i a, __m256i b) { 1145 // CHECK-LABEL: test_mm256_sub_epi64 1146 // CHECK: sub <4 x i64> 1147 return _mm256_sub_epi64(a, b); 1148 } 1149 1150 __m256i test_mm256_subs_epi8(__m256i a, __m256i b) { 1151 // CHECK-LABEL: test_mm256_subs_epi8 1152 // CHECK: call <32 x i8> @llvm.x86.avx2.psubs.b(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 1153 return _mm256_subs_epi8(a, b); 1154 } 1155 1156 __m256i test_mm256_subs_epi16(__m256i a, __m256i b) { 1157 // CHECK-LABEL: test_mm256_subs_epi16 1158 // CHECK: call <16 x i16> @llvm.x86.avx2.psubs.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 1159 return _mm256_subs_epi16(a, b); 1160 } 1161 1162 __m256i test_mm256_subs_epu8(__m256i a, __m256i b) { 1163 // CHECK-LABEL: test_mm256_subs_epu8 1164 // CHECK: call <32 x i8> @llvm.x86.avx2.psubus.b(<32 x i8> %{{.*}}, <32 x i8> %{{.*}}) 1165 return _mm256_subs_epu8(a, b); 1166 } 1167 1168 __m256i test_mm256_subs_epu16(__m256i a, __m256i b) { 1169 // CHECK-LABEL: test_mm256_subs_epu16 1170 // CHECK: call <16 x i16> @llvm.x86.avx2.psubus.w(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}) 1171 return _mm256_subs_epu16(a, b); 1172 } 1173 1174 __m256i test_mm256_unpackhi_epi8(__m256i a, __m256i b) { 1175 // CHECK-LABEL: test_mm256_unpackhi_epi8 1176 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <i32 8, i32 40, i32 9, i32 41, i32 10, i32 42, i32 11, i32 43, i32 12, i32 44, i32 13, i32 45, i32 14, i32 46, i32 15, i32 47, i32 24, i32 56, i32 25, i32 57, i32 26, i32 58, i32 27, i32 59, i32 28, i32 60, i32 29, i32 61, i32 30, i32 62, i32 31, i32 63> 1177 return _mm256_unpackhi_epi8(a, b); 1178 } 1179 1180 __m256i test_mm256_unpackhi_epi16(__m256i a, __m256i b) { 1181 // CHECK-LABEL: test_mm256_unpackhi_epi16 1182 // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31> 1183 return _mm256_unpackhi_epi16(a, b); 1184 } 1185 1186 __m256i test_mm256_unpackhi_epi32(__m256i a, __m256i b) { 1187 // CHECK-LABEL: test_mm256_unpackhi_epi32 1188 // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 2, i32 10, i32 3, i32 11, i32 6, i32 14, i32 7, i32 15> 1189 return _mm256_unpackhi_epi32(a, b); 1190 } 1191 1192 __m256i test_mm256_unpackhi_epi64(__m256i a, __m256i b) { 1193 // CHECK-LABEL: test_mm256_unpackhi_epi64 1194 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> <i32 1, i32 5, i32 3, i32 7> 1195 return _mm256_unpackhi_epi64(a, b); 1196 } 1197 1198 __m256i test_mm256_unpacklo_epi8(__m256i a, __m256i b) { 1199 // CHECK-LABEL: test_mm256_unpacklo_epi8 1200 // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <i32 0, i32 32, i32 1, i32 33, i32 2, i32 34, i32 3, i32 35, i32 4, i32 36, i32 5, i32 37, i32 6, i32 38, i32 7, i32 39, i32 16, i32 48, i32 17, i32 49, i32 18, i32 50, i32 19, i32 51, i32 20, i32 52, i32 21, i32 53, i32 22, i32 54, i32 23, i32 55> 1201 return _mm256_unpacklo_epi8(a, b); 1202 } 1203 1204 __m256i test_mm256_unpacklo_epi16(__m256i a, __m256i b) { 1205 // CHECK-LABEL: test_mm256_unpacklo_epi16 1206 // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27> 1207 return _mm256_unpacklo_epi16(a, b); 1208 } 1209 1210 __m256i test_mm256_unpacklo_epi32(__m256i a, __m256i b) { 1211 // CHECK-LABEL: test_mm256_unpacklo_epi32 1212 // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 4, i32 12, i32 5, i32 13> 1213 return _mm256_unpacklo_epi32(a, b); 1214 } 1215 1216 __m256i test_mm256_unpacklo_epi64(__m256i a, __m256i b) { 1217 // CHECK-LABEL: test_mm256_unpacklo_epi64 1218 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 2, i32 6> 1219 return _mm256_unpacklo_epi64(a, b); 1220 } 1221 1222 __m256i test_mm256_xor_si256(__m256i a, __m256i b) { 1223 // CHECK-LABEL: test_mm256_xor_si256 1224 // CHECK: xor <4 x i64> 1225 return _mm256_xor_si256(a, b); 1226 } 1227