diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 17 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 42 | 
2 files changed, 27 insertions, 32 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index 6786d69f9fe..fa079242e75 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -3013,6 +3013,23 @@ unsigned X86AsmParser::checkTargetMatchPredicate(MCInst &Inst) {        (MCID.TSFlags & X86II::EncodingMask) != X86II::VEX)      return Match_Unsupported; +  // These instructions match ambiguously with their VEX encoded counterparts +  // and appear first in the matching table. Reject them unless we're forcing +  // EVEX encoding. +  // FIXME: We really need a way to break the ambiguity. +  switch (Opc) { +  case X86::VCVTSD2SIZrm_Int: +  case X86::VCVTSD2SI64Zrm_Int: +  case X86::VCVTSS2SIZrm_Int: +  case X86::VCVTSS2SI64Zrm_Int: +  case X86::VCVTTSD2SIZrm:   case X86::VCVTTSD2SIZrm_Int: +  case X86::VCVTTSD2SI64Zrm: case X86::VCVTTSD2SI64Zrm_Int: +  case X86::VCVTTSS2SIZrm:   case X86::VCVTTSS2SIZrm_Int: +  case X86::VCVTTSS2SI64Zrm: case X86::VCVTTSS2SI64Zrm_Int: +    if (ForcedVEXEncoding != VEXEncoding_EVEX) +      return Match_Unsupported; +  } +    return Match_Success;  } diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 28661b56bdf..a8158448151 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -7442,8 +7442,7 @@ multiclass avx512_cvt_s_int_round<bits<8> opc, X86VectorVTInfo SrcVT,                                    X86VectorVTInfo DstVT, SDNode OpNode,                                    SDNode OpNodeRnd,                                    X86FoldableSchedWrite sched, string asm, -                                  string aliasStr, -                                  bit CodeGenOnly = 1> { +                                  string aliasStr> {    let Predicates = [HasAVX512] in {      def rr_Int : SI<opc, MRMSrcReg, (outs DstVT.RC:$dst), (ins SrcVT.RC:$src),                  !strconcat(asm,"\t{$src, $dst|$dst, $src}"), @@ -7454,7 +7453,6 @@ multiclass avx512_cvt_s_int_round<bits<8> opc, X86VectorVTInfo SrcVT,                   [(set DstVT.RC:$dst, (OpNodeRnd (SrcVT.VT SrcVT.RC:$src),(i32 timm:$rc)))]>,                   EVEX, VEX_LIG, EVEX_B, EVEX_RC,                   Sched<[sched]>; -    let isCodeGenOnly = CodeGenOnly, ForceDisassemble = CodeGenOnly in      def rm_Int : SI<opc, MRMSrcMem, (outs DstVT.RC:$dst), (ins SrcVT.IntScalarMemOp:$src),                  !strconcat(asm,"\t{$src, $dst|$dst, $src}"),                  [(set DstVT.RC:$dst, (OpNode @@ -7466,14 +7464,6 @@ multiclass avx512_cvt_s_int_round<bits<8> opc, X86VectorVTInfo SrcVT,            (!cast<Instruction>(NAME # "rr_Int") DstVT.RC:$dst, SrcVT.RC:$src), 0, "att">;    def : InstAlias<"v" # asm # aliasStr # "\t{$rc, $src, $dst|$dst, $src, $rc}",            (!cast<Instruction>(NAME # "rrb_Int") DstVT.RC:$dst, SrcVT.RC:$src, AVX512RC:$rc), 0, "att">; -} - -multiclass avx512_cvt_s_int_round_aliases<bits<8> opc, X86VectorVTInfo SrcVT, -                                          X86VectorVTInfo DstVT, SDNode OpNode, -                                          SDNode OpNodeRnd, -                                          X86FoldableSchedWrite sched, string asm, -                                          string aliasStr> : -  avx512_cvt_s_int_round<opc, SrcVT, DstVT, OpNode, OpNodeRnd, sched, asm, aliasStr, 0> {    def : InstAlias<"v" # asm # aliasStr # "\t{$src, $dst|$dst, $src}",            (!cast<Instruction>(NAME # "rm_Int") DstVT.RC:$dst,                                            SrcVT.IntScalarMemOp:$src), 0, "att">; @@ -7486,10 +7476,10 @@ defm VCVTSS2SIZ: avx512_cvt_s_int_round<0x2D, f32x_info, i32x_info,X86cvts2si,  defm VCVTSS2SI64Z: avx512_cvt_s_int_round<0x2D, f32x_info, i64x_info, X86cvts2si,                                     X86cvts2siRnd, WriteCvtSS2I, "cvtss2si", "{q}">,                                     XS, VEX_W, EVEX_CD8<32, CD8VT1>; -defm VCVTSS2USIZ: avx512_cvt_s_int_round_aliases<0x79, f32x_info, i32x_info, X86cvts2usi, +defm VCVTSS2USIZ: avx512_cvt_s_int_round<0x79, f32x_info, i32x_info, X86cvts2usi,                                     X86cvts2usiRnd, WriteCvtSS2I, "cvtss2usi", "{l}">,                                     XS, EVEX_CD8<32, CD8VT1>; -defm VCVTSS2USI64Z: avx512_cvt_s_int_round_aliases<0x79, f32x_info, i64x_info, X86cvts2usi, +defm VCVTSS2USI64Z: avx512_cvt_s_int_round<0x79, f32x_info, i64x_info, X86cvts2usi,                                     X86cvts2usiRnd, WriteCvtSS2I, "cvtss2usi", "{q}">,                                     XS, VEX_W, EVEX_CD8<32, CD8VT1>;  defm VCVTSD2SIZ: avx512_cvt_s_int_round<0x2D, f64x_info, i32x_info, X86cvts2si, @@ -7498,10 +7488,10 @@ defm VCVTSD2SIZ: avx512_cvt_s_int_round<0x2D, f64x_info, i32x_info, X86cvts2si,  defm VCVTSD2SI64Z: avx512_cvt_s_int_round<0x2D, f64x_info, i64x_info, X86cvts2si,                                     X86cvts2siRnd, WriteCvtSD2I, "cvtsd2si", "{q}">,                                     XD, VEX_W, EVEX_CD8<64, CD8VT1>; -defm VCVTSD2USIZ:   avx512_cvt_s_int_round_aliases<0x79, f64x_info, i32x_info, X86cvts2usi, +defm VCVTSD2USIZ:   avx512_cvt_s_int_round<0x79, f64x_info, i32x_info, X86cvts2usi,                                     X86cvts2usiRnd, WriteCvtSD2I, "cvtsd2usi", "{l}">,                                     XD, EVEX_CD8<64, CD8VT1>; -defm VCVTSD2USI64Z: avx512_cvt_s_int_round_aliases<0x79, f64x_info, i64x_info, X86cvts2usi, +defm VCVTSD2USI64Z: avx512_cvt_s_int_round<0x79, f64x_info, i64x_info, X86cvts2usi,                                     X86cvts2usiRnd, WriteCvtSD2I, "cvtsd2usi", "{q}">,                                     XD, VEX_W, EVEX_CD8<64, CD8VT1>; @@ -7593,8 +7583,7 @@ def : Pat<(v2f64 (X86Movsd  multiclass avx512_cvt_s_all<bits<8> opc, string asm, X86VectorVTInfo _SrcRC,                              X86VectorVTInfo _DstRC, SDNode OpNode,                              SDNode OpNodeInt, SDNode OpNodeSAE, -                            X86FoldableSchedWrite sched, string aliasStr, -                            bit CodeGenOnly = 1>{ +                            X86FoldableSchedWrite sched, string aliasStr>{  let Predicates = [HasAVX512] in {    let isCodeGenOnly = 1 in {    def rr : AVX512<opc, MRMSrcReg, (outs _DstRC.RC:$dst), (ins _SrcRC.FRC:$src), @@ -7615,7 +7604,6 @@ let Predicates = [HasAVX512] in {              !strconcat(asm,"\t{{sae}, $src, $dst|$dst, $src, {sae}}"),              [(set _DstRC.RC:$dst, (OpNodeSAE (_SrcRC.VT _SrcRC.RC:$src)))]>,                                    EVEX, VEX_LIG, EVEX_B, Sched<[sched]>; -  let isCodeGenOnly = CodeGenOnly, ForceDisassemble = CodeGenOnly in    def rm_Int : AVX512<opc, MRMSrcMem, (outs _DstRC.RC:$dst),                (ins _SrcRC.IntScalarMemOp:$src),                !strconcat(asm,"\t{$src, $dst|$dst, $src}"), @@ -7628,16 +7616,6 @@ let Predicates = [HasAVX512] in {            (!cast<Instruction>(NAME # "rr_Int") _DstRC.RC:$dst, _SrcRC.RC:$src), 0, "att">;    def : InstAlias<asm # aliasStr # "\t{{sae}, $src, $dst|$dst, $src, {sae}}",            (!cast<Instruction>(NAME # "rrb_Int") _DstRC.RC:$dst, _SrcRC.RC:$src), 0, "att">; -} - -multiclass avx512_cvt_s_all_unsigned<bits<8> opc, string asm, -                                     X86VectorVTInfo _SrcRC, -                                     X86VectorVTInfo _DstRC, SDNode OpNode, -                                     SDNode OpNodeInt, SDNode OpNodeSAE, -                                     X86FoldableSchedWrite sched, -                                     string aliasStr> : -  avx512_cvt_s_all<opc, asm, _SrcRC, _DstRC, OpNode, OpNodeInt, OpNodeSAE, sched, -                   aliasStr, 0> {    def : InstAlias<asm # aliasStr # "\t{$src, $dst|$dst, $src}",            (!cast<Instruction>(NAME # "rm_Int") _DstRC.RC:$dst,                                            _SrcRC.IntScalarMemOp:$src), 0, "att">; @@ -7656,16 +7634,16 @@ defm VCVTTSD2SI64Z: avx512_cvt_s_all<0x2C, "vcvttsd2si", f64x_info, i64x_info,                          fp_to_sint, X86cvtts2Int, X86cvtts2IntSAE, WriteCvtSD2I,                          "{q}">, VEX_W, XD, EVEX_CD8<64, CD8VT1>; -defm VCVTTSS2USIZ: avx512_cvt_s_all_unsigned<0x78, "vcvttss2usi", f32x_info, i32x_info, +defm VCVTTSS2USIZ: avx512_cvt_s_all<0x78, "vcvttss2usi", f32x_info, i32x_info,                          fp_to_uint, X86cvtts2UInt, X86cvtts2UIntSAE, WriteCvtSS2I,                          "{l}">, XS, EVEX_CD8<32, CD8VT1>; -defm VCVTTSS2USI64Z: avx512_cvt_s_all_unsigned<0x78, "vcvttss2usi", f32x_info, i64x_info, +defm VCVTTSS2USI64Z: avx512_cvt_s_all<0x78, "vcvttss2usi", f32x_info, i64x_info,                          fp_to_uint, X86cvtts2UInt, X86cvtts2UIntSAE, WriteCvtSS2I,                          "{q}">, XS,VEX_W, EVEX_CD8<32, CD8VT1>; -defm VCVTTSD2USIZ: avx512_cvt_s_all_unsigned<0x78, "vcvttsd2usi", f64x_info, i32x_info, +defm VCVTTSD2USIZ: avx512_cvt_s_all<0x78, "vcvttsd2usi", f64x_info, i32x_info,                          fp_to_uint, X86cvtts2UInt, X86cvtts2UIntSAE, WriteCvtSD2I,                          "{l}">, XD, EVEX_CD8<64, CD8VT1>; -defm VCVTTSD2USI64Z: avx512_cvt_s_all_unsigned<0x78, "vcvttsd2usi", f64x_info, i64x_info, +defm VCVTTSD2USI64Z: avx512_cvt_s_all<0x78, "vcvttsd2usi", f64x_info, i64x_info,                          fp_to_uint, X86cvtts2UInt, X86cvtts2UIntSAE, WriteCvtSD2I,                          "{q}">, XD, VEX_W, EVEX_CD8<64, CD8VT1>;  | 

