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