From: Craig Topper Date: Sun, 14 Apr 2019 20:52:42 +0000 (+0000) Subject: [X86] Redefine KUNPCK instructions to take a narrower source register class than... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=31fb1782bc68071e3cfdfe80a59ff40ae24cb1ab;p=llvm [X86] Redefine KUNPCK instructions to take a narrower source register class than destination register class. Remove copies from the isel output pattern. There's no reason for the inputs to be the destination register class. This just forces an unnecessary copy in the output patterns. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358362 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86InstrAVX512.td b/lib/Target/X86/X86InstrAVX512.td index f86d9894df9..853f1f73a28 100644 --- a/lib/Target/X86/X86InstrAVX512.td +++ b/lib/Target/X86/X86InstrAVX512.td @@ -2988,26 +2988,24 @@ defm : avx512_binop_pat; defm : avx512_binop_pat; // Mask unpacking -multiclass avx512_mask_unpck { let Predicates = [prd] in { let hasSideEffects = 0 in - def rr : I<0x4b, MRMSrcReg, (outs KRC:$dst), - (ins KRC:$src1, KRC:$src2), + def rr : I<0x4b, MRMSrcReg, (outs Dst.KRC:$dst), + (ins Src.KRC:$src1, Src.KRC:$src2), "kunpck"#Suffix#"\t{$src2, $src1, $dst|$dst, $src1, $src2}", []>, VEX_4V, VEX_L, Sched<[sched]>; - def : Pat<(VT (concat_vectors KRCSrc:$src1, KRCSrc:$src2)), - (!cast(NAME##rr) - (COPY_TO_REGCLASS KRCSrc:$src2, KRC), - (COPY_TO_REGCLASS KRCSrc:$src1, KRC))>; + def : Pat<(Dst.KVT (concat_vectors Src.KRC:$src1, Src.KRC:$src2)), + (!cast(NAME##rr) Src.KRC:$src2, Src.KRC:$src1)>; } } -defm KUNPCKBW : avx512_mask_unpck<"bw", VK16, v16i1, VK8, WriteShuffle, HasAVX512>, PD; -defm KUNPCKWD : avx512_mask_unpck<"wd", VK32, v32i1, VK16, WriteShuffle, HasBWI>, PS; -defm KUNPCKDQ : avx512_mask_unpck<"dq", VK64, v64i1, VK32, WriteShuffle, HasBWI>, PS, VEX_W; +defm KUNPCKBW : avx512_mask_unpck<"bw", v16i1_info, v8i1_info, WriteShuffle, HasAVX512>, PD; +defm KUNPCKWD : avx512_mask_unpck<"wd", v32i1_info, v16i1_info, WriteShuffle, HasBWI>, PS; +defm KUNPCKDQ : avx512_mask_unpck<"dq", v64i1_info, v32i1_info, WriteShuffle, HasBWI>, PS, VEX_W; // Mask bit testing multiclass avx512_mask_testop opc, string OpcodeStr, RegisterClass KRC,