From b23094366e4069a75d645f357789efd102072d0f Mon Sep 17 00:00:00 2001 From: Igor Breger Date: Tue, 8 Sep 2015 13:10:00 +0000 Subject: [PATCH] AVX512: kunpck encoding implementation Added tests for encoding. Differential Revision: http://reviews.llvm.org/D12061 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247010 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 4 ++-- lib/Target/X86/X86InstrAVX512.td | 30 +++++++++++++++--------------- test/CodeGen/X86/avx512-vec-cmp.ll | 27 ++++++++++++++++++++++++++- test/MC/X86/avx512-encodings.s | 4 ++++ test/MC/X86/x86-64-avx512bw.s | 8 ++++++++ 5 files changed, 55 insertions(+), 18 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 4fc1d00cad0..c33c1d4cc54 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1580,8 +1580,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM, setOperationAction(ISD::MUL, MVT::v32i16, Legal); setOperationAction(ISD::MULHS, MVT::v32i16, Legal); setOperationAction(ISD::MULHU, MVT::v32i16, Legal); - setOperationAction(ISD::CONCAT_VECTORS, MVT::v32i1, Custom); - setOperationAction(ISD::CONCAT_VECTORS, MVT::v64i1, Custom); + setOperationAction(ISD::CONCAT_VECTORS, MVT::v32i1, Legal); + setOperationAction(ISD::CONCAT_VECTORS, MVT::v64i1, Legal); setOperationAction(ISD::INSERT_SUBVECTOR, MVT::v32i1, Custom); setOperationAction(ISD::INSERT_SUBVECTOR, MVT::v64i1, Custom); setOperationAction(ISD::SELECT, MVT::v32i1, Custom); diff --git a/lib/Target/X86/X86InstrAVX512.td b/lib/Target/X86/X86InstrAVX512.td index b87ce7c6c5f..47763ee374f 100644 --- a/lib/Target/X86/X86InstrAVX512.td +++ b/lib/Target/X86/X86InstrAVX512.td @@ -2054,24 +2054,24 @@ def : Pat<(xor (xor VK1:$src1, VK1:$src2), (i1 1)), (COPY_TO_REGCLASS VK1:$src2, VK16)), VK1)>; // Mask unpacking -multiclass avx512_mask_unpck opc, string OpcodeStr, - RegisterClass KRC> { - let Predicates = [HasAVX512] in - def rr : I; -} +multiclass avx512_mask_unpck { + let Predicates = [prd] in { + def rr : I<0x4b, MRMSrcReg, (outs KRC:$dst), + (ins KRC:$src1, KRC:$src2), + "kunpck"#Suffix#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", []>, + VEX_4V, VEX_L; -multiclass avx512_mask_unpck_bw opc, string OpcodeStr> { - defm BW : avx512_mask_unpck, - VEX_4V, VEX_L, PD; + def : Pat<(VT (concat_vectors KRCSrc:$src1, KRCSrc:$src2)), + (!cast(NAME##rr) + (COPY_TO_REGCLASS KRCSrc:$src2, KRC), + (COPY_TO_REGCLASS KRCSrc:$src1, KRC))>; + } } -defm KUNPCK : avx512_mask_unpck_bw<0x4b, "kunpck">; -def : Pat<(v16i1 (concat_vectors (v8i1 VK8:$src1), (v8i1 VK8:$src2))), - (KUNPCKBWrr (COPY_TO_REGCLASS VK8:$src2, VK16), - (COPY_TO_REGCLASS VK8:$src1, VK16))>; - +defm KUNPCKBW : avx512_mask_unpck<"bw", VK16, v16i1, VK8, HasAVX512>, PD; +defm KUNPCKWD : avx512_mask_unpck<"wd", VK32, v32i1, VK16, HasBWI>, PS; +defm KUNPCKDQ : avx512_mask_unpck<"dq", VK64, v64i1, VK32, HasBWI>, PS, VEX_W; multiclass avx512_mask_unpck_int { let Predicates = [HasAVX512] in diff --git a/test/CodeGen/X86/avx512-vec-cmp.ll b/test/CodeGen/X86/avx512-vec-cmp.ll index 6a4a3aa7e37..a8c558df9de 100644 --- a/test/CodeGen/X86/avx512-vec-cmp.ll +++ b/test/CodeGen/X86/avx512-vec-cmp.ll @@ -152,7 +152,6 @@ define <8 x i32> @test11_unsigned(<8 x i32> %x, <8 x i32> %y) nounwind { ret <8 x i32> %max } - define i16 @test12(<16 x i64> %a, <16 x i64> %b) nounwind { ; KNL-LABEL: test12: ; KNL: ## BB#0: @@ -166,6 +165,32 @@ define i16 @test12(<16 x i64> %a, <16 x i64> %b) nounwind { ret i16 %res1 } +define i32 @test12_v32i32(<32 x i32> %a, <32 x i32> %b) nounwind { +; SKX-LABEL: test12_v32i32: +; SKX: ## BB#0: +; SKX-NEXT: vpcmpeqd %zmm2, %zmm0, %k0 +; SKX-NEXT: vpcmpeqd %zmm3, %zmm1, %k1 +; SKX-NEXT: kunpckwd %k0, %k1, %k0 +; SKX-NEXT: kmovd %k0, %eax +; SKX-NEXT: retq + %res = icmp eq <32 x i32> %a, %b + %res1 = bitcast <32 x i1> %res to i32 + ret i32 %res1 +} + +define i64 @test12_v64i16(<64 x i16> %a, <64 x i16> %b) nounwind { +; SKX-LABEL: test12_v64i16: +; SKX: ## BB#0: +; SKX-NEXT: vpcmpeqw %zmm2, %zmm0, %k0 +; SKX-NEXT: vpcmpeqw %zmm3, %zmm1, %k1 +; SKX-NEXT: kunpckdq %k0, %k1, %k0 +; SKX-NEXT: kmovq %k0, %rax +; SKX-NEXT: retq + %res = icmp eq <64 x i16> %a, %b + %res1 = bitcast <64 x i1> %res to i64 + ret i64 %res1 +} + define <16 x i32> @test13(<16 x float>%a, <16 x float>%b) ; KNL-LABEL: test13: ; KNL: ## BB#0: diff --git a/test/MC/X86/avx512-encodings.s b/test/MC/X86/avx512-encodings.s index 2a60c8da56a..70191bde9f8 100644 --- a/test/MC/X86/avx512-encodings.s +++ b/test/MC/X86/avx512-encodings.s @@ -14958,6 +14958,10 @@ vpermilpd $0x23, 0x400(%rbx), %zmm2 // CHECK: encoding: [0x62,0xf2,0xc5,0x08,0x43,0x92,0xf8,0xfb,0xff,0xff] vgetexpsd -1032(%rdx), %xmm7, %xmm2 +// CHECK: kunpckbw %k6, %k5, %k5 +// CHECK: encoding: [0xc5,0xd5,0x4b,0xee] + kunpckbw %k6, %k5, %k5 + // CHECK: vgetmantss $171, %xmm12, %xmm2, %xmm3 // CHECK: encoding: [0x62,0xd3,0x6d,0x08,0x27,0xdc,0xab] vgetmantss $0xab, %xmm12, %xmm2, %xmm3 diff --git a/test/MC/X86/x86-64-avx512bw.s b/test/MC/X86/x86-64-avx512bw.s index c557da13ea8..e362683bad1 100644 --- a/test/MC/X86/x86-64-avx512bw.s +++ b/test/MC/X86/x86-64-avx512bw.s @@ -4112,6 +4112,14 @@ // CHECK: encoding: [0x62,0x61,0x2d,0x40,0x69,0xb2,0xc0,0xdf,0xff,0xff] vpunpckhwd -8256(%rdx), %zmm26, %zmm30 +// CHECK: kunpckdq %k4, %k6, %k4 +// CHECK: encoding: [0xc4,0xe1,0xcc,0x4b,0xe4] + kunpckdq %k4, %k6, %k4 + +// CHECK: kunpckwd %k6, %k5, %k5 +// CHECK: encoding: [0xc5,0xd4,0x4b,0xee] + kunpckwd %k6, %k5, %k5 + // CHECK: ktestd %k3, %k3 // CHECK: encoding: [0xc4,0xe1,0xf9,0x99,0xdb] ktestd %k3, %k3 -- 2.34.1