@@ -1417,3 +1417,59 @@ define {i32, i1} @test_v16i8_muti_uses(<16 x i8> %x, <16 x i8>%y, <16 x i8> %z)
1417
1417
%r2 = insertvalue {i32 , i1 } %r1 , i1 %c , 1
1418
1418
ret {i32 , i1 } %r2
1419
1419
}
1420
+
1421
+ ; PR59867
1422
+ define i1 @select_v2i8 (ptr %s0 , ptr %s1 ) {
1423
+ ; SSE2-LABEL: select_v2i8:
1424
+ ; SSE2: # %bb.0:
1425
+ ; SSE2-NEXT: movzwl (%rdi), %eax
1426
+ ; SSE2-NEXT: movd %eax, %xmm0
1427
+ ; SSE2-NEXT: movzwl (%rsi), %eax
1428
+ ; SSE2-NEXT: movd %eax, %xmm1
1429
+ ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1430
+ ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1431
+ ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]
1432
+ ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1433
+ ; SSE2-NEXT: movmskpd %xmm0, %eax
1434
+ ; SSE2-NEXT: testl %eax, %eax
1435
+ ; SSE2-NEXT: setne %al
1436
+ ; SSE2-NEXT: retq
1437
+ ;
1438
+ ; SSE42-LABEL: select_v2i8:
1439
+ ; SSE42: # %bb.0:
1440
+ ; SSE42-NEXT: pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1441
+ ; SSE42-NEXT: pmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1442
+ ; SSE42-NEXT: pcmpeqq %xmm0, %xmm1
1443
+ ; SSE42-NEXT: movmskpd %xmm1, %eax
1444
+ ; SSE42-NEXT: testl %eax, %eax
1445
+ ; SSE42-NEXT: setne %al
1446
+ ; SSE42-NEXT: retq
1447
+ ;
1448
+ ; AVX1OR2-LABEL: select_v2i8:
1449
+ ; AVX1OR2: # %bb.0:
1450
+ ; AVX1OR2-NEXT: vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1451
+ ; AVX1OR2-NEXT: vpmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1452
+ ; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
1453
+ ; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0
1454
+ ; AVX1OR2-NEXT: setne %al
1455
+ ; AVX1OR2-NEXT: retq
1456
+ ;
1457
+ ; AVX512-LABEL: select_v2i8:
1458
+ ; AVX512: # %bb.0:
1459
+ ; AVX512-NEXT: movzwl (%rdi), %eax
1460
+ ; AVX512-NEXT: vmovd %eax, %xmm0
1461
+ ; AVX512-NEXT: movzwl (%rsi), %eax
1462
+ ; AVX512-NEXT: vmovd %eax, %xmm1
1463
+ ; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %k0
1464
+ ; AVX512-NEXT: kmovd %k0, %eax
1465
+ ; AVX512-NEXT: testb $3, %al
1466
+ ; AVX512-NEXT: setne %al
1467
+ ; AVX512-NEXT: retq
1468
+ %v0 = load <2 x i8 >, ptr %s0 , align 1
1469
+ %v1 = load <2 x i8 >, ptr %s1 , align 1
1470
+ %cmp = icmp eq <2 x i8 > %v0 , %v1
1471
+ %cmp0 = extractelement <2 x i1 > %cmp , i32 0
1472
+ %cmp1 = extractelement <2 x i1 > %cmp , i32 1
1473
+ %res = select i1 %cmp0 , i1 true , i1 %cmp1
1474
+ ret i1 %res
1475
+ }
0 commit comments