@@ -621,17 +621,41 @@ define void @vec256_double(ptr %in.elt.ptr, ptr %out.vec.ptr) nounwind {
621621}
622622
623623define void @vec256_i128 (ptr %in.elt.ptr , ptr %out.vec.ptr ) nounwind {
624- ; ALL-LABEL: vec256_i128:
625- ; ALL: # %bb.0:
626- ; ALL-NEXT: movq (%rdi), %rax
627- ; ALL-NEXT: movq 8(%rdi), %rcx
628- ; ALL-NEXT: notq %rcx
629- ; ALL-NEXT: notq %rax
630- ; ALL-NEXT: movq %rax, (%rsi)
631- ; ALL-NEXT: movq %rcx, 8(%rsi)
632- ; ALL-NEXT: movq %rcx, 24(%rsi)
633- ; ALL-NEXT: movq %rax, 16(%rsi)
634- ; ALL-NEXT: retq
624+ ; SCALAR-LABEL: vec256_i128:
625+ ; SCALAR: # %bb.0:
626+ ; SCALAR-NEXT: movq (%rdi), %rax
627+ ; SCALAR-NEXT: movq 8(%rdi), %rcx
628+ ; SCALAR-NEXT: notq %rcx
629+ ; SCALAR-NEXT: notq %rax
630+ ; SCALAR-NEXT: movq %rax, (%rsi)
631+ ; SCALAR-NEXT: movq %rcx, 8(%rsi)
632+ ; SCALAR-NEXT: movq %rcx, 24(%rsi)
633+ ; SCALAR-NEXT: movq %rax, 16(%rsi)
634+ ; SCALAR-NEXT: retq
635+ ;
636+ ; SSE-LABEL: vec256_i128:
637+ ; SSE: # %bb.0:
638+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
639+ ; SSE-NEXT: pxor (%rdi), %xmm0
640+ ; SSE-NEXT: movdqa %xmm0, (%rsi)
641+ ; SSE-NEXT: movdqa %xmm0, 16(%rsi)
642+ ; SSE-NEXT: retq
643+ ;
644+ ; AVX-LABEL: vec256_i128:
645+ ; AVX: # %bb.0:
646+ ; AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
647+ ; AVX-NEXT: vpxor (%rdi), %xmm0, %xmm0
648+ ; AVX-NEXT: vmovdqa %xmm0, 16(%rsi)
649+ ; AVX-NEXT: vmovdqa %xmm0, (%rsi)
650+ ; AVX-NEXT: retq
651+ ;
652+ ; AVX512-LABEL: vec256_i128:
653+ ; AVX512: # %bb.0:
654+ ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
655+ ; AVX512-NEXT: vpxor (%rdi), %xmm0, %xmm0
656+ ; AVX512-NEXT: vmovdqa %xmm0, 16(%rsi)
657+ ; AVX512-NEXT: vmovdqa %xmm0, (%rsi)
658+ ; AVX512-NEXT: retq
635659 %in.elt.not = load i128 , ptr %in.elt.ptr , align 64
636660 %in.elt = xor i128 %in.elt.not , -1
637661 %out.elt0.ptr = getelementptr i128 , ptr %out.vec.ptr , i64 0
@@ -1034,19 +1058,46 @@ define void @vec384_double(ptr %in.elt.ptr, ptr %out.vec.ptr) nounwind {
10341058}
10351059
10361060define void @vec384_i128 (ptr %in.elt.ptr , ptr %out.vec.ptr ) nounwind {
1037- ; ALL-LABEL: vec384_i128:
1038- ; ALL: # %bb.0:
1039- ; ALL-NEXT: movq (%rdi), %rax
1040- ; ALL-NEXT: movq 8(%rdi), %rcx
1041- ; ALL-NEXT: notq %rcx
1042- ; ALL-NEXT: notq %rax
1043- ; ALL-NEXT: movq %rax, (%rsi)
1044- ; ALL-NEXT: movq %rcx, 8(%rsi)
1045- ; ALL-NEXT: movq %rcx, 24(%rsi)
1046- ; ALL-NEXT: movq %rax, 16(%rsi)
1047- ; ALL-NEXT: movq %rcx, 40(%rsi)
1048- ; ALL-NEXT: movq %rax, 32(%rsi)
1049- ; ALL-NEXT: retq
1061+ ; SCALAR-LABEL: vec384_i128:
1062+ ; SCALAR: # %bb.0:
1063+ ; SCALAR-NEXT: movq (%rdi), %rax
1064+ ; SCALAR-NEXT: movq 8(%rdi), %rcx
1065+ ; SCALAR-NEXT: notq %rcx
1066+ ; SCALAR-NEXT: notq %rax
1067+ ; SCALAR-NEXT: movq %rax, (%rsi)
1068+ ; SCALAR-NEXT: movq %rcx, 8(%rsi)
1069+ ; SCALAR-NEXT: movq %rcx, 24(%rsi)
1070+ ; SCALAR-NEXT: movq %rax, 16(%rsi)
1071+ ; SCALAR-NEXT: movq %rcx, 40(%rsi)
1072+ ; SCALAR-NEXT: movq %rax, 32(%rsi)
1073+ ; SCALAR-NEXT: retq
1074+ ;
1075+ ; SSE-LABEL: vec384_i128:
1076+ ; SSE: # %bb.0:
1077+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
1078+ ; SSE-NEXT: pxor (%rdi), %xmm0
1079+ ; SSE-NEXT: movdqa %xmm0, (%rsi)
1080+ ; SSE-NEXT: movdqa %xmm0, 16(%rsi)
1081+ ; SSE-NEXT: movdqa %xmm0, 32(%rsi)
1082+ ; SSE-NEXT: retq
1083+ ;
1084+ ; AVX-LABEL: vec384_i128:
1085+ ; AVX: # %bb.0:
1086+ ; AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1087+ ; AVX-NEXT: vpxor (%rdi), %xmm0, %xmm0
1088+ ; AVX-NEXT: vmovdqa %xmm0, (%rsi)
1089+ ; AVX-NEXT: vmovdqa %xmm0, 16(%rsi)
1090+ ; AVX-NEXT: vmovdqa %xmm0, 32(%rsi)
1091+ ; AVX-NEXT: retq
1092+ ;
1093+ ; AVX512-LABEL: vec384_i128:
1094+ ; AVX512: # %bb.0:
1095+ ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1096+ ; AVX512-NEXT: vpxor (%rdi), %xmm0, %xmm0
1097+ ; AVX512-NEXT: vmovdqa %xmm0, (%rsi)
1098+ ; AVX512-NEXT: vmovdqa %xmm0, 16(%rsi)
1099+ ; AVX512-NEXT: vmovdqa %xmm0, 32(%rsi)
1100+ ; AVX512-NEXT: retq
10501101 %in.elt.not = load i128 , ptr %in.elt.ptr , align 64
10511102 %in.elt = xor i128 %in.elt.not , -1
10521103 %out.elt0.ptr = getelementptr i128 , ptr %out.vec.ptr , i64 0
@@ -1559,21 +1610,60 @@ define void @vec512_double(ptr %in.elt.ptr, ptr %out.vec.ptr) nounwind {
15591610}
15601611
15611612define void @vec512_i128 (ptr %in.elt.ptr , ptr %out.vec.ptr ) nounwind {
1562- ; ALL-LABEL: vec512_i128:
1563- ; ALL: # %bb.0:
1564- ; ALL-NEXT: movq (%rdi), %rax
1565- ; ALL-NEXT: movq 8(%rdi), %rcx
1566- ; ALL-NEXT: notq %rcx
1567- ; ALL-NEXT: notq %rax
1568- ; ALL-NEXT: movq %rax, (%rsi)
1569- ; ALL-NEXT: movq %rcx, 8(%rsi)
1570- ; ALL-NEXT: movq %rcx, 24(%rsi)
1571- ; ALL-NEXT: movq %rax, 16(%rsi)
1572- ; ALL-NEXT: movq %rcx, 40(%rsi)
1573- ; ALL-NEXT: movq %rax, 32(%rsi)
1574- ; ALL-NEXT: movq %rcx, 56(%rsi)
1575- ; ALL-NEXT: movq %rax, 48(%rsi)
1576- ; ALL-NEXT: retq
1613+ ; SCALAR-LABEL: vec512_i128:
1614+ ; SCALAR: # %bb.0:
1615+ ; SCALAR-NEXT: movq (%rdi), %rax
1616+ ; SCALAR-NEXT: movq 8(%rdi), %rcx
1617+ ; SCALAR-NEXT: notq %rcx
1618+ ; SCALAR-NEXT: notq %rax
1619+ ; SCALAR-NEXT: movq %rax, (%rsi)
1620+ ; SCALAR-NEXT: movq %rcx, 8(%rsi)
1621+ ; SCALAR-NEXT: movq %rcx, 24(%rsi)
1622+ ; SCALAR-NEXT: movq %rax, 16(%rsi)
1623+ ; SCALAR-NEXT: movq %rcx, 40(%rsi)
1624+ ; SCALAR-NEXT: movq %rax, 32(%rsi)
1625+ ; SCALAR-NEXT: movq %rcx, 56(%rsi)
1626+ ; SCALAR-NEXT: movq %rax, 48(%rsi)
1627+ ; SCALAR-NEXT: retq
1628+ ;
1629+ ; SSE-LABEL: vec512_i128:
1630+ ; SSE: # %bb.0:
1631+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
1632+ ; SSE-NEXT: pxor (%rdi), %xmm0
1633+ ; SSE-NEXT: movdqa %xmm0, (%rsi)
1634+ ; SSE-NEXT: movdqa %xmm0, 16(%rsi)
1635+ ; SSE-NEXT: movdqa %xmm0, 32(%rsi)
1636+ ; SSE-NEXT: movdqa %xmm0, 48(%rsi)
1637+ ; SSE-NEXT: retq
1638+ ;
1639+ ; AVX1-LABEL: vec512_i128:
1640+ ; AVX1: # %bb.0:
1641+ ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1642+ ; AVX1-NEXT: vpxor (%rdi), %xmm0, %xmm0
1643+ ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
1644+ ; AVX1-NEXT: vmovaps %ymm0, (%rsi)
1645+ ; AVX1-NEXT: vmovaps %ymm0, 32(%rsi)
1646+ ; AVX1-NEXT: vzeroupper
1647+ ; AVX1-NEXT: retq
1648+ ;
1649+ ; AVX2-LABEL: vec512_i128:
1650+ ; AVX2: # %bb.0:
1651+ ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1652+ ; AVX2-NEXT: vpxor (%rdi), %xmm0, %xmm0
1653+ ; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0
1654+ ; AVX2-NEXT: vmovdqa %ymm0, (%rsi)
1655+ ; AVX2-NEXT: vmovdqa %ymm0, 32(%rsi)
1656+ ; AVX2-NEXT: vzeroupper
1657+ ; AVX2-NEXT: retq
1658+ ;
1659+ ; AVX512-LABEL: vec512_i128:
1660+ ; AVX512: # %bb.0:
1661+ ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1662+ ; AVX512-NEXT: vpxor (%rdi), %xmm0, %xmm0
1663+ ; AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]
1664+ ; AVX512-NEXT: vmovdqa64 %zmm0, (%rsi)
1665+ ; AVX512-NEXT: vzeroupper
1666+ ; AVX512-NEXT: retq
15771667 %in.elt.not = load i128 , ptr %in.elt.ptr , align 64
15781668 %in.elt = xor i128 %in.elt.not , -1
15791669 %out.elt0.ptr = getelementptr i128 , ptr %out.vec.ptr , i64 0
@@ -1588,25 +1678,71 @@ define void @vec512_i128(ptr %in.elt.ptr, ptr %out.vec.ptr) nounwind {
15881678}
15891679
15901680define void @vec512_i256 (ptr %in.elt.ptr , ptr %out.vec.ptr ) nounwind {
1591- ; ALL-LABEL: vec512_i256:
1592- ; ALL: # %bb.0:
1593- ; ALL-NEXT: movq 16(%rdi), %rax
1594- ; ALL-NEXT: movq 24(%rdi), %rcx
1595- ; ALL-NEXT: movq (%rdi), %rdx
1596- ; ALL-NEXT: movq 8(%rdi), %rdi
1597- ; ALL-NEXT: notq %rdi
1598- ; ALL-NEXT: notq %rdx
1599- ; ALL-NEXT: notq %rcx
1600- ; ALL-NEXT: notq %rax
1601- ; ALL-NEXT: movq %rax, 16(%rsi)
1602- ; ALL-NEXT: movq %rcx, 24(%rsi)
1603- ; ALL-NEXT: movq %rdx, (%rsi)
1604- ; ALL-NEXT: movq %rdi, 8(%rsi)
1605- ; ALL-NEXT: movq %rax, 48(%rsi)
1606- ; ALL-NEXT: movq %rcx, 56(%rsi)
1607- ; ALL-NEXT: movq %rdx, 32(%rsi)
1608- ; ALL-NEXT: movq %rdi, 40(%rsi)
1609- ; ALL-NEXT: retq
1681+ ; SCALAR-LABEL: vec512_i256:
1682+ ; SCALAR: # %bb.0:
1683+ ; SCALAR-NEXT: movq 16(%rdi), %rax
1684+ ; SCALAR-NEXT: movq 24(%rdi), %rcx
1685+ ; SCALAR-NEXT: movq (%rdi), %rdx
1686+ ; SCALAR-NEXT: movq 8(%rdi), %rdi
1687+ ; SCALAR-NEXT: notq %rdi
1688+ ; SCALAR-NEXT: notq %rdx
1689+ ; SCALAR-NEXT: notq %rcx
1690+ ; SCALAR-NEXT: notq %rax
1691+ ; SCALAR-NEXT: movq %rax, 16(%rsi)
1692+ ; SCALAR-NEXT: movq %rcx, 24(%rsi)
1693+ ; SCALAR-NEXT: movq %rdx, (%rsi)
1694+ ; SCALAR-NEXT: movq %rdi, 8(%rsi)
1695+ ; SCALAR-NEXT: movq %rax, 48(%rsi)
1696+ ; SCALAR-NEXT: movq %rcx, 56(%rsi)
1697+ ; SCALAR-NEXT: movq %rdx, 32(%rsi)
1698+ ; SCALAR-NEXT: movq %rdi, 40(%rsi)
1699+ ; SCALAR-NEXT: retq
1700+ ;
1701+ ; SSE-LABEL: vec512_i256:
1702+ ; SSE: # %bb.0:
1703+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
1704+ ; SSE-NEXT: movdqa (%rdi), %xmm1
1705+ ; SSE-NEXT: pxor %xmm0, %xmm1
1706+ ; SSE-NEXT: pxor 16(%rdi), %xmm0
1707+ ; SSE-NEXT: movdqa %xmm0, 16(%rsi)
1708+ ; SSE-NEXT: movdqa %xmm1, (%rsi)
1709+ ; SSE-NEXT: movdqa %xmm1, 32(%rsi)
1710+ ; SSE-NEXT: movdqa %xmm0, 48(%rsi)
1711+ ; SSE-NEXT: retq
1712+ ;
1713+ ; AVX1-LABEL: vec512_i256:
1714+ ; AVX1: # %bb.0:
1715+ ; AVX1-NEXT: vxorps %xmm0, %xmm0, %xmm0
1716+ ; AVX1-NEXT: vcmptrueps %ymm0, %ymm0, %ymm0
1717+ ; AVX1-NEXT: vxorps (%rdi), %ymm0, %ymm0
1718+ ; AVX1-NEXT: vextractf128 $1, %ymm0, 16(%rsi)
1719+ ; AVX1-NEXT: vmovaps %xmm0, (%rsi)
1720+ ; AVX1-NEXT: vextractf128 $1, %ymm0, 48(%rsi)
1721+ ; AVX1-NEXT: vmovaps %xmm0, 32(%rsi)
1722+ ; AVX1-NEXT: vzeroupper
1723+ ; AVX1-NEXT: retq
1724+ ;
1725+ ; AVX2-LABEL: vec512_i256:
1726+ ; AVX2: # %bb.0:
1727+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
1728+ ; AVX2-NEXT: vpxor (%rdi), %ymm0, %ymm0
1729+ ; AVX2-NEXT: vextracti128 $1, %ymm0, 16(%rsi)
1730+ ; AVX2-NEXT: vmovdqa %xmm0, (%rsi)
1731+ ; AVX2-NEXT: vextracti128 $1, %ymm0, 48(%rsi)
1732+ ; AVX2-NEXT: vmovdqa %xmm0, 32(%rsi)
1733+ ; AVX2-NEXT: vzeroupper
1734+ ; AVX2-NEXT: retq
1735+ ;
1736+ ; AVX512-LABEL: vec512_i256:
1737+ ; AVX512: # %bb.0:
1738+ ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
1739+ ; AVX512-NEXT: vpxor (%rdi), %ymm0, %ymm0
1740+ ; AVX512-NEXT: vextracti128 $1, %ymm0, 16(%rsi)
1741+ ; AVX512-NEXT: vmovdqa %xmm0, (%rsi)
1742+ ; AVX512-NEXT: vextracti128 $1, %ymm0, 48(%rsi)
1743+ ; AVX512-NEXT: vmovdqa %xmm0, 32(%rsi)
1744+ ; AVX512-NEXT: vzeroupper
1745+ ; AVX512-NEXT: retq
16101746 %in.elt.not = load i256 , ptr %in.elt.ptr , align 64
16111747 %in.elt = xor i256 %in.elt.not , -1
16121748 %out.elt0.ptr = getelementptr i256 , ptr %out.vec.ptr , i64 0
@@ -1616,14 +1752,8 @@ define void @vec512_i256(ptr %in.elt.ptr, ptr %out.vec.ptr) nounwind {
16161752 ret void
16171753}
16181754;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
1619- ; AVX: {{.*}}
1620- ; AVX1: {{.*}}
1621- ; AVX2: {{.*}}
1622- ; AVX512: {{.*}}
16231755; AVX512BW: {{.*}}
16241756; AVX512F: {{.*}}
1625- ; SCALAR: {{.*}}
1626- ; SSE: {{.*}}
16271757; SSE2: {{.*}}
16281758; SSE2-ONLY: {{.*}}
16291759; SSE3: {{.*}}
0 commit comments