diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86InstrAVX512.td')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 82 | 
1 files changed, 50 insertions, 32 deletions
diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 3c5ae583c2a..6046541d439 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -6123,19 +6123,20 @@ let Predicates = [HasAVX512] in {  //  multiclass avx512_fma3p_213_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, +                               X86FoldableSchedWrite sched,                                 X86VectorVTInfo _, string Suff> {    let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in {    defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.RC:$src3),            OpcodeStr, "$src3, $src2", "$src2, $src3",            (_.VT (OpNode _.RC:$src2, _.RC:$src1, _.RC:$src3)), 1, 1>, -          AVX512FMA3Base, Sched<[WriteFMA]>; +          AVX512FMA3Base, Sched<[sched]>;    defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.MemOp:$src3),            OpcodeStr, "$src3, $src2", "$src2, $src3",            (_.VT (OpNode _.RC:$src2, _.RC:$src1, (_.LdFrag addr:$src3))), 1, 0>, -          AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; +          AVX512FMA3Base, Sched<[sched.Folded, ReadAfterLd]>;    defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst),              (ins _.RC:$src2, _.ScalarMemOp:$src3), @@ -6143,32 +6144,37 @@ multiclass avx512_fma3p_213_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,              !strconcat("$src2, ${src3}", _.BroadcastStr ),              (OpNode _.RC:$src2,               _.RC:$src1,(_.VT (X86VBroadcast (_.ScalarLdFrag addr:$src3)))), 1, 0>, -             AVX512FMA3Base, EVEX_B, Sched<[WriteFMALd, ReadAfterLd]>; +             AVX512FMA3Base, EVEX_B, Sched<[sched.Folded, ReadAfterLd]>;    }  }  multiclass avx512_fma3_213_round<bits<8> opc, string OpcodeStr, SDNode OpNode, +                                 X86FoldableSchedWrite sched,                                   X86VectorVTInfo _, string Suff> {    let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in    defm rb: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc),            OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc",            (_.VT ( OpNode _.RC:$src2, _.RC:$src1, _.RC:$src3, (i32 imm:$rc))), 1, 1>, -          AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; +          AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[sched]>;  }  multiclass avx512_fma3p_213_common<bits<8> opc, string OpcodeStr, SDNode OpNode,                                     SDNode OpNodeRnd, AVX512VLVectorVTInfo _,                                     string Suff> {    let Predicates = [HasAVX512] in { -    defm Z      : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, _.info512, Suff>, -                  avx512_fma3_213_round<opc, OpcodeStr, OpNodeRnd, _.info512, -                      Suff>, EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>; +    defm Z      : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, WriteFMAY, +                                      _.info512, Suff>, +                  avx512_fma3_213_round<opc, OpcodeStr, OpNodeRnd, WriteFMAY, +                                        _.info512, Suff>, +                              EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>;    }    let Predicates = [HasVLX, HasAVX512] in { -    defm Z256 : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, _.info256, Suff>, +    defm Z256 : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, WriteFMAY, +                                    _.info256, Suff>,                        EVEX_V256, EVEX_CD8<_.info256.EltSize, CD8VF>; -    defm Z128 : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, _.info128, Suff>, +    defm Z128 : avx512_fma3p_213_rm<opc, OpcodeStr, OpNode, WriteFMA, +                                    _.info128, Suff>,                        EVEX_V128, EVEX_CD8<_.info128.EltSize, CD8VF>;    }  } @@ -6190,19 +6196,20 @@ defm VFNMSUB213   : avx512_fma3p_213_f<0xAE, "vfnmsub213", X86Fnmsub, X86FnmsubR  multiclass avx512_fma3p_231_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, +                               X86FoldableSchedWrite sched,                                 X86VectorVTInfo _, string Suff> {    let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in {    defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.RC:$src3),            OpcodeStr, "$src3, $src2", "$src2, $src3",            (_.VT (OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1)), 1, 1, -          vselect, 1>, AVX512FMA3Base, Sched<[WriteFMA]>; +          vselect, 1>, AVX512FMA3Base, Sched<[sched]>;    defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.MemOp:$src3),            OpcodeStr, "$src3, $src2", "$src2, $src3",            (_.VT (OpNode _.RC:$src2, (_.LdFrag addr:$src3), _.RC:$src1)), 1, 0>, -          AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; +          AVX512FMA3Base, Sched<[sched.Folded, ReadAfterLd]>;    defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst),           (ins _.RC:$src2, _.ScalarMemOp:$src3), @@ -6211,11 +6218,12 @@ multiclass avx512_fma3p_231_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,           (_.VT (OpNode _.RC:$src2,                        (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))),                        _.RC:$src1)), 1, 0>, AVX512FMA3Base, EVEX_B, -         Sched<[WriteFMALd, ReadAfterLd]>; +         Sched<[sched.Folded, ReadAfterLd]>;    }  }  multiclass avx512_fma3_231_round<bits<8> opc, string OpcodeStr, SDNode OpNode, +                                 X86FoldableSchedWrite sched,                                   X86VectorVTInfo _, string Suff> {    let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in    defm rb: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), @@ -6223,21 +6231,25 @@ multiclass avx512_fma3_231_round<bits<8> opc, string OpcodeStr, SDNode OpNode,            OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc",            (_.VT ( OpNode _.RC:$src2, _.RC:$src3, _.RC:$src1, (i32 imm:$rc))),            1, 1, vselect, 1>, -          AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; +          AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[sched]>;  }  multiclass avx512_fma3p_231_common<bits<8> opc, string OpcodeStr, SDNode OpNode,                                     SDNode OpNodeRnd, AVX512VLVectorVTInfo _,                                     string Suff> {    let Predicates = [HasAVX512] in { -    defm Z      : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, _.info512, Suff>, -                  avx512_fma3_231_round<opc, OpcodeStr, OpNodeRnd, _.info512, -                      Suff>, EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>; +    defm Z      : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, WriteFMAY, +                                      _.info512, Suff>, +                  avx512_fma3_231_round<opc, OpcodeStr, OpNodeRnd, WriteFMAY, +                                        _.info512, Suff>, +                              EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>;    }    let Predicates = [HasVLX, HasAVX512] in { -    defm Z256 : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, _.info256, Suff>, +    defm Z256 : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, WriteFMAY, +                                    _.info256, Suff>,                        EVEX_V256, EVEX_CD8<_.info256.EltSize, CD8VF>; -    defm Z128 : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, _.info128, Suff>, +    defm Z128 : avx512_fma3p_231_rm<opc, OpcodeStr, OpNode, WriteFMA, +                                    _.info128, Suff>,                        EVEX_V128, EVEX_CD8<_.info128.EltSize, CD8VF>;    }  } @@ -6258,13 +6270,14 @@ defm VFNMADD231   : avx512_fma3p_231_f<0xBC, "vfnmadd231", X86Fnmadd, X86FnmaddR  defm VFNMSUB231   : avx512_fma3p_231_f<0xBE, "vfnmsub231", X86Fnmsub, X86FnmsubRnd>;  multiclass avx512_fma3p_132_rm<bits<8> opc, string OpcodeStr, SDNode OpNode, +                               X86FoldableSchedWrite sched,                                 X86VectorVTInfo _, string Suff> {    let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in {    defm r: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.RC:$src3),            OpcodeStr, "$src3, $src2", "$src2, $src3",            (_.VT (OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2)), 1, 1, vselect, 1>, -          AVX512FMA3Base, Sched<[WriteFMA]>; +          AVX512FMA3Base, Sched<[sched]>;    // Pattern is 312 order so that the load is in a different place from the    // 213 and 231 patterns this helps tablegen's duplicate pattern detection. @@ -6272,7 +6285,7 @@ multiclass avx512_fma3p_132_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,            (ins _.RC:$src2, _.MemOp:$src3),            OpcodeStr, "$src3, $src2", "$src2, $src3",            (_.VT (OpNode (_.LdFrag addr:$src3), _.RC:$src1, _.RC:$src2)), 1, 0>, -          AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; +          AVX512FMA3Base, Sched<[sched.Folded, ReadAfterLd]>;    // Pattern is 312 order so that the load is in a different place from the    // 213 and 231 patterns this helps tablegen's duplicate pattern detection. @@ -6282,11 +6295,12 @@ multiclass avx512_fma3p_132_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,           "$src2, ${src3}"##_.BroadcastStr,           (_.VT (OpNode (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))),                         _.RC:$src1, _.RC:$src2)), 1, 0>, -         AVX512FMA3Base, EVEX_B, Sched<[WriteFMALd, ReadAfterLd]>; +         AVX512FMA3Base, EVEX_B, Sched<[sched.Folded, ReadAfterLd]>;    }  }  multiclass avx512_fma3_132_round<bits<8> opc, string OpcodeStr, SDNode OpNode, +                                 X86FoldableSchedWrite sched,                                   X86VectorVTInfo _, string Suff> {    let Constraints = "$src1 = $dst", ExeDomain = _.ExeDomain, hasSideEffects = 0 in    defm rb: AVX512_maskable_3src<opc, MRMSrcReg, _, (outs _.RC:$dst), @@ -6294,21 +6308,25 @@ multiclass avx512_fma3_132_round<bits<8> opc, string OpcodeStr, SDNode OpNode,            OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc",            (_.VT ( OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2, (i32 imm:$rc))),            1, 1, vselect, 1>, -          AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; +          AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[sched]>;  }  multiclass avx512_fma3p_132_common<bits<8> opc, string OpcodeStr, SDNode OpNode,                                     SDNode OpNodeRnd, AVX512VLVectorVTInfo _,                                     string Suff> {    let Predicates = [HasAVX512] in { -    defm Z      : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, _.info512, Suff>, -                  avx512_fma3_132_round<opc, OpcodeStr, OpNodeRnd, _.info512, -                      Suff>, EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>; +    defm Z      : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, WriteFMAY, +                                      _.info512, Suff>, +                  avx512_fma3_132_round<opc, OpcodeStr, OpNodeRnd, WriteFMAY, +                                        _.info512, Suff>, +                              EVEX_V512, EVEX_CD8<_.info512.EltSize, CD8VF>;    }    let Predicates = [HasVLX, HasAVX512] in { -    defm Z256 : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, _.info256, Suff>, +    defm Z256 : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, WriteFMAY, +                                    _.info256, Suff>,                        EVEX_V256, EVEX_CD8<_.info256.EltSize, CD8VF>; -    defm Z128 : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, _.info128, Suff>, +    defm Z128 : avx512_fma3p_132_rm<opc, OpcodeStr, OpNode, WriteFMA, +                                    _.info128, Suff>,                        EVEX_V128, EVEX_CD8<_.info128.EltSize, CD8VF>;    }  } @@ -6336,29 +6354,29 @@ let Constraints = "$src1 = $dst", hasSideEffects = 0 in {    defm r_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.RC:$src3), OpcodeStr,            "$src3, $src2", "$src2, $src3", RHS_VEC_r, 1, 1>, -          AVX512FMA3Base, Sched<[WriteFMA]>; +          AVX512FMA3Base, Sched<[WriteFMAS]>;    defm m_Int: AVX512_maskable_3src_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst),            (ins _.RC:$src2, _.IntScalarMemOp:$src3), OpcodeStr,            "$src3, $src2", "$src2, $src3", RHS_VEC_m, 1, 1>, -          AVX512FMA3Base, Sched<[WriteFMALd, ReadAfterLd]>; +          AVX512FMA3Base, Sched<[WriteFMASLd, ReadAfterLd]>;    defm rb_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),           (ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc),           OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", RHS_VEC_rb, 1, 1>, -         AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMA]>; +         AVX512FMA3Base, EVEX_B, EVEX_RC, Sched<[WriteFMAS]>;    let isCodeGenOnly = 1, isCommutable = 1 in {      def r     : AVX512FMA3S<opc, MRMSrcReg, (outs _.FRC:$dst),                       (ins _.FRC:$src1, _.FRC:$src2, _.FRC:$src3),                       !strconcat(OpcodeStr,                                "\t{$src3, $src2, $dst|$dst, $src2, $src3}"), -                     !if(MaskOnlyReg, [], [RHS_r])>, Sched<[WriteFMA]>; +                     !if(MaskOnlyReg, [], [RHS_r])>, Sched<[WriteFMAS]>;      def m     : AVX512FMA3S<opc, MRMSrcMem, (outs _.FRC:$dst),                      (ins _.FRC:$src1, _.FRC:$src2, _.ScalarMemOp:$src3),                      !strconcat(OpcodeStr,                                 "\t{$src3, $src2, $dst|$dst, $src2, $src3}"), -                    [RHS_m]>, Sched<[WriteFMALd, ReadAfterLd]>; +                    [RHS_m]>, Sched<[WriteFMASLd, ReadAfterLd]>;    }// isCodeGenOnly = 1  }// Constraints = "$src1 = $dst"  }  | 

