@@ -1447,3 +1447,158 @@ define i1 @eq_i512_load_arg(ptr%p, i512 %b) {
14471447 %r = icmp eq i512 %a , %b
14481448 ret i1 %r
14491449}
1450+
1451+ ; Tests for any/allbits from memory.
1452+
1453+ define i1 @anybits_i128_load_arg (ptr %w ) {
1454+ ; ANY-LABEL: anybits_i128_load_arg:
1455+ ; ANY: # %bb.0:
1456+ ; ANY-NEXT: movq (%rdi), %rax
1457+ ; ANY-NEXT: orq 8(%rdi), %rax
1458+ ; ANY-NEXT: setne %al
1459+ ; ANY-NEXT: retq
1460+ %ld = load i128 , ptr %w
1461+ %cmp = icmp ne i128 %ld , 0
1462+ ret i1 %cmp
1463+ }
1464+
1465+ define i1 @allbits_i128_load_arg (ptr %w ) {
1466+ ; SSE2-LABEL: allbits_i128_load_arg:
1467+ ; SSE2: # %bb.0:
1468+ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1469+ ; SSE2-NEXT: pcmpeqb (%rdi), %xmm0
1470+ ; SSE2-NEXT: pmovmskb %xmm0, %eax
1471+ ; SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1472+ ; SSE2-NEXT: sete %al
1473+ ; SSE2-NEXT: retq
1474+ ;
1475+ ; SSE41-LABEL: allbits_i128_load_arg:
1476+ ; SSE41: # %bb.0:
1477+ ; SSE41-NEXT: movdqa (%rdi), %xmm0
1478+ ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1479+ ; SSE41-NEXT: ptest %xmm1, %xmm0
1480+ ; SSE41-NEXT: setb %al
1481+ ; SSE41-NEXT: retq
1482+ ;
1483+ ; AVXANY-LABEL: allbits_i128_load_arg:
1484+ ; AVXANY: # %bb.0:
1485+ ; AVXANY-NEXT: vmovdqa (%rdi), %xmm0
1486+ ; AVXANY-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1487+ ; AVXANY-NEXT: vptest %xmm1, %xmm0
1488+ ; AVXANY-NEXT: setb %al
1489+ ; AVXANY-NEXT: retq
1490+ %ld = load i128 , ptr %w
1491+ %cmp = icmp eq i128 %ld , -1
1492+ ret i1 %cmp
1493+ }
1494+
1495+ define i1 @anybits_i256_load_arg (ptr %w ) {
1496+ ; ANY-LABEL: anybits_i256_load_arg:
1497+ ; ANY: # %bb.0:
1498+ ; ANY-NEXT: movq (%rdi), %rax
1499+ ; ANY-NEXT: movq 8(%rdi), %rcx
1500+ ; ANY-NEXT: orq 24(%rdi), %rcx
1501+ ; ANY-NEXT: orq 16(%rdi), %rax
1502+ ; ANY-NEXT: orq %rcx, %rax
1503+ ; ANY-NEXT: setne %al
1504+ ; ANY-NEXT: retq
1505+ %ld = load i256 , ptr %w
1506+ %cmp = icmp ne i256 %ld , 0
1507+ ret i1 %cmp
1508+ }
1509+
1510+ define i1 @allbits_i256_load_arg (ptr %w ) {
1511+ ; SSE-LABEL: allbits_i256_load_arg:
1512+ ; SSE: # %bb.0:
1513+ ; SSE-NEXT: movq (%rdi), %rax
1514+ ; SSE-NEXT: movq 8(%rdi), %rcx
1515+ ; SSE-NEXT: andq 24(%rdi), %rcx
1516+ ; SSE-NEXT: andq 16(%rdi), %rax
1517+ ; SSE-NEXT: andq %rcx, %rax
1518+ ; SSE-NEXT: cmpq $-1, %rax
1519+ ; SSE-NEXT: sete %al
1520+ ; SSE-NEXT: retq
1521+ ;
1522+ ; AVX1-LABEL: allbits_i256_load_arg:
1523+ ; AVX1: # %bb.0:
1524+ ; AVX1-NEXT: vmovdqu (%rdi), %ymm0
1525+ ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1526+ ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1527+ ; AVX1-NEXT: vptest %ymm1, %ymm0
1528+ ; AVX1-NEXT: setb %al
1529+ ; AVX1-NEXT: vzeroupper
1530+ ; AVX1-NEXT: retq
1531+ ;
1532+ ; AVX2-LABEL: allbits_i256_load_arg:
1533+ ; AVX2: # %bb.0:
1534+ ; AVX2-NEXT: vmovdqu (%rdi), %ymm0
1535+ ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1536+ ; AVX2-NEXT: vptest %ymm1, %ymm0
1537+ ; AVX2-NEXT: setb %al
1538+ ; AVX2-NEXT: vzeroupper
1539+ ; AVX2-NEXT: retq
1540+ ;
1541+ ; AVX512-LABEL: allbits_i256_load_arg:
1542+ ; AVX512: # %bb.0:
1543+ ; AVX512-NEXT: vmovdqu (%rdi), %ymm0
1544+ ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1545+ ; AVX512-NEXT: vptest %ymm1, %ymm0
1546+ ; AVX512-NEXT: setb %al
1547+ ; AVX512-NEXT: vzeroupper
1548+ ; AVX512-NEXT: retq
1549+ %ld = load i256 , ptr %w
1550+ %cmp = icmp eq i256 %ld , -1
1551+ ret i1 %cmp
1552+ }
1553+
1554+ define i1 @anybits_i512_load_arg (ptr %w ) {
1555+ ; ANY-LABEL: anybits_i512_load_arg:
1556+ ; ANY: # %bb.0:
1557+ ; ANY-NEXT: movq 16(%rdi), %rax
1558+ ; ANY-NEXT: movq (%rdi), %rcx
1559+ ; ANY-NEXT: movq 8(%rdi), %rdx
1560+ ; ANY-NEXT: movq 24(%rdi), %rsi
1561+ ; ANY-NEXT: orq 56(%rdi), %rsi
1562+ ; ANY-NEXT: orq 40(%rdi), %rdx
1563+ ; ANY-NEXT: orq %rsi, %rdx
1564+ ; ANY-NEXT: orq 48(%rdi), %rax
1565+ ; ANY-NEXT: orq 32(%rdi), %rcx
1566+ ; ANY-NEXT: orq %rax, %rcx
1567+ ; ANY-NEXT: orq %rdx, %rcx
1568+ ; ANY-NEXT: setne %al
1569+ ; ANY-NEXT: retq
1570+ %ld = load i512 , ptr %w
1571+ %cmp = icmp ne i512 %ld , 0
1572+ ret i1 %cmp
1573+ }
1574+
1575+ define i1 @allbits_i512_load_arg (ptr %w ) {
1576+ ; NO512-LABEL: allbits_i512_load_arg:
1577+ ; NO512: # %bb.0:
1578+ ; NO512-NEXT: movq 16(%rdi), %rax
1579+ ; NO512-NEXT: movq (%rdi), %rcx
1580+ ; NO512-NEXT: movq 8(%rdi), %rdx
1581+ ; NO512-NEXT: movq 24(%rdi), %rsi
1582+ ; NO512-NEXT: andq 56(%rdi), %rsi
1583+ ; NO512-NEXT: andq 40(%rdi), %rdx
1584+ ; NO512-NEXT: andq %rsi, %rdx
1585+ ; NO512-NEXT: andq 48(%rdi), %rax
1586+ ; NO512-NEXT: andq 32(%rdi), %rcx
1587+ ; NO512-NEXT: andq %rax, %rcx
1588+ ; NO512-NEXT: andq %rdx, %rcx
1589+ ; NO512-NEXT: cmpq $-1, %rcx
1590+ ; NO512-NEXT: sete %al
1591+ ; NO512-NEXT: retq
1592+ ;
1593+ ; AVX512-LABEL: allbits_i512_load_arg:
1594+ ; AVX512: # %bb.0:
1595+ ; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 = -1
1596+ ; AVX512-NEXT: vpcmpneqd (%rdi), %zmm0, %k0
1597+ ; AVX512-NEXT: kortestw %k0, %k0
1598+ ; AVX512-NEXT: sete %al
1599+ ; AVX512-NEXT: vzeroupper
1600+ ; AVX512-NEXT: retq
1601+ %ld = load i512 , ptr %w
1602+ %cmp = icmp eq i512 %ld , -1
1603+ ret i1 %cmp
1604+ }
0 commit comments