Index: lib/Target/X86/X86InstrAVX512.td =================================================================== --- lib/Target/X86/X86InstrAVX512.td +++ lib/Target/X86/X86InstrAVX512.td @@ -2458,7 +2458,7 @@ HasBWI>, VEX, PS, VEX_W; } -defm KNOT : avx512_mask_unop_all<0x44, "knot", not>; +defm KNOT : avx512_mask_unop_all<0x44, "knot", null_frag>; multiclass avx512_mask_unop_int { let Predicates = [HasAVX512] in @@ -2516,14 +2516,11 @@ HasBWI, IsCommutable>, VEX_4V, VEX_L, VEX_W, PS; } -def andn : PatFrag<(ops node:$i0, node:$i1), (and (not node:$i0), node:$i1)>; -def xnor : PatFrag<(ops node:$i0, node:$i1), (not (xor node:$i0, node:$i1))>; - defm KAND : avx512_mask_binop_all<0x41, "kand", and, 1>; defm KOR : avx512_mask_binop_all<0x45, "kor", or, 1>; -defm KXNOR : avx512_mask_binop_all<0x46, "kxnor", xnor, 1>; +defm KXNOR : avx512_mask_binop_all<0x46, "kxnor", null_frag, 1>; defm KXOR : avx512_mask_binop_all<0x47, "kxor", xor, 1>; -defm KANDN : avx512_mask_binop_all<0x42, "kandn", andn, 0>; +defm KANDN : avx512_mask_binop_all<0x42, "kandn", null_frag, 0>; defm KADD : avx512_mask_binop_all<0x4A, "kadd", add, 1, HasDQI>; multiclass avx512_mask_binop_int { @@ -2566,11 +2563,35 @@ } defm : avx512_binop_pat; -defm : avx512_binop_pat; defm : avx512_binop_pat; -defm : avx512_binop_pat; defm : avx512_binop_pat; +def : Pat<(and VK16:$src1, (xor VK16:$src2, (v16i1 immAllOnesV))), + (KANDNWrr VK16:$src1, VK16:$src2)>; +def : Pat<(and VK8:$src1, (xor VK8:$src2, (v8i1 immAllOnesV))), + (KANDNBrr VK8:$src1, VK8:$src2)>, Requires<[HasDQI]>; +def : Pat<(and VK32:$src1, (xor VK32:$src2, (v32i1 immAllOnesV))), + (KANDNDrr VK32:$src1, VK32:$src2)>, Requires<[HasBWI]>; +def : Pat<(and VK64:$src1, (xor VK64:$src2, (v64i1 immAllOnesV))), + (KANDNQrr VK64:$src1, VK64:$src2)>, Requires<[HasBWI]>; + +let Predicates = [NoDQI] in +def : Pat<(and VK8:$src1, (xor VK8:$src2, (v8i1 immAllOnesV))), + (COPY_TO_REGCLASS (KANDNWrr (COPY_TO_REGCLASS VK8:$src1, VK16), + (COPY_TO_REGCLASS VK8:$src2, VK16)), VK8)>; + +def : Pat<(and VK4:$src1, (xor VK4:$src2, (v4i1 immAllOnesV))), + (COPY_TO_REGCLASS (KANDNWrr (COPY_TO_REGCLASS VK4:$src1, VK16), + (COPY_TO_REGCLASS VK4:$src2, VK16)), VK4)>; + +def : Pat<(and VK2:$src1, (xor VK2:$src2, (v2i1 immAllOnesV))), + (COPY_TO_REGCLASS (KANDNWrr (COPY_TO_REGCLASS VK2:$src1, VK16), + (COPY_TO_REGCLASS VK2:$src2, VK16)), VK2)>; + +def : Pat<(and VK1:$src1, (xor VK1:$src2, (i1 1))), + (COPY_TO_REGCLASS (KANDNWrr (COPY_TO_REGCLASS VK1:$src1, VK16), + (COPY_TO_REGCLASS VK1:$src2, VK16)), VK1)>; + def : Pat<(xor (xor VK16:$src1, VK16:$src2), (v16i1 immAllOnesV)), (KXNORWrr VK16:$src1, VK16:$src2)>; def : Pat<(xor (xor VK8:$src1, VK8:$src2), (v8i1 immAllOnesV)), Index: test/CodeGen/X86/avx512-mask-op.ll =================================================================== --- test/CodeGen/X86/avx512-mask-op.ll +++ test/CodeGen/X86/avx512-mask-op.ll @@ -257,9 +257,9 @@ ; ; SKX-LABEL: test4: ; SKX: ## BB#0: -; SKX-NEXT: vpcmpgtq %ymm3, %ymm2, %k0 -; SKX-NEXT: knotw %k0, %k1 -; SKX-NEXT: vpcmpgtq %ymm1, %ymm0, %k0 {%k1} +; SKX-NEXT: vpcmpgtq %ymm1, %ymm0, %k0 +; SKX-NEXT: vpcmpgtq %ymm3, %ymm2, %k1 +; SKX-NEXT: kandnw %k1, %k0, %k0 ; SKX-NEXT: vpmovm2d %k0, %xmm0 ; SKX-NEXT: retq %x_gt_y = icmp sgt <4 x i64> %x, %y @@ -280,8 +280,8 @@ ; SKX-LABEL: test5: ; SKX: ## BB#0: ; SKX-NEXT: vpcmpgtq %xmm0, %xmm1, %k0 -; SKX-NEXT: knotw %k0, %k1 -; SKX-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} +; SKX-NEXT: vpcmpgtq %xmm3, %xmm2, %k1 +; SKX-NEXT: kandnw %k0, %k1, %k0 ; SKX-NEXT: vpmovm2q %k0, %xmm0 ; SKX-NEXT: retq %x_gt_y = icmp slt <2 x i64> %x, %y Index: test/CodeGen/X86/avx512-select.ll =================================================================== --- test/CodeGen/X86/avx512-select.ll +++ test/CodeGen/X86/avx512-select.ll @@ -133,10 +133,9 @@ ; CHECK-NEXT: kmovw %edx, %k0 ; CHECK-NEXT: kmovw %edi, %k1 ; CHECK-NEXT: kmovw %esi, %k2 -; CHECK-NEXT: kandw %k0, %k1, %k1 -; CHECK-NEXT: knotw %k0, %k0 -; CHECK-NEXT: kandw %k0, %k2, %k0 -; CHECK-NEXT: korw %k0, %k1, %k0 +; CHECK-NEXT: kandnw %k0, %k2, %k2 +; CHECK-NEXT: kandw %k0, %k1, %k0 +; CHECK-NEXT: korw %k2, %k0, %k0 ; CHECK-NEXT: kmovw %k0, %eax ; CHECK-NEXT: retq %mask = bitcast i8 %m to <8 x i1>