diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86Instr3DNow.td | 8 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 214 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrMMX.td | 14 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrSSE.td | 146 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedBroadwell.td | 16 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedHaswell.td | 16 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSandyBridge.td | 16 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSkylakeClient.td | 16 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedSkylakeServer.td | 84 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86Schedule.td | 29 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleAtom.td | 37 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBtVer2.td | 71 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleSLM.td | 16 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleZnver1.td | 14 |
14 files changed, 338 insertions, 359 deletions
diff --git a/llvm/lib/Target/X86/X86Instr3DNow.td b/llvm/lib/Target/X86/X86Instr3DNow.td index c64c6be3cf0..46dc6bf7661 100644 --- a/llvm/lib/Target/X86/X86Instr3DNow.td +++ b/llvm/lib/Target/X86/X86Instr3DNow.td @@ -55,7 +55,7 @@ multiclass I3DNow_conv_rm_int<bits<8> opc, string Mn, } defm PAVGUSB : I3DNow_binop_rm_int<0xBF, "pavgusb", SchedWriteVecALU.MMX, 1>; -defm PF2ID : I3DNow_conv_rm_int<0x1D, "pf2id", WriteCvtF2I>; +defm PF2ID : I3DNow_conv_rm_int<0x1D, "pf2id", WriteCvtPS2I>; defm PFACC : I3DNow_binop_rm_int<0xAE, "pfacc", WriteFAdd>; defm PFADD : I3DNow_binop_rm_int<0x9E, "pfadd", WriteFAdd, 1>; defm PFCMPEQ : I3DNow_binop_rm_int<0xB0, "pfcmpeq", WriteFAdd, 1>; @@ -71,7 +71,7 @@ defm PFRSQIT1 : I3DNow_binop_rm_int<0xA7, "pfrsqit1", WriteFAdd>; defm PFRSQRT : I3DNow_conv_rm_int<0x97, "pfrsqrt", WriteFAdd>; defm PFSUB : I3DNow_binop_rm_int<0x9A, "pfsub", WriteFAdd, 1>; defm PFSUBR : I3DNow_binop_rm_int<0xAA, "pfsubr", WriteFAdd, 1>; -defm PI2FD : I3DNow_conv_rm_int<0x0D, "pi2fd", WriteCvtI2F>; +defm PI2FD : I3DNow_conv_rm_int<0x0D, "pi2fd", WriteCvtI2PS>; defm PMULHRW : I3DNow_binop_rm_int<0xB7, "pmulhrw", SchedWriteVecIMul.MMX, 1>; let SchedRW = [WriteEMMS] in @@ -104,8 +104,8 @@ def PREFETCHWT1 : I<0x0D, MRM2m, (outs), (ins i8mem:$addr), "prefetchwt1\t$addr" } // "3DNowA" instructions -defm PF2IW : I3DNow_conv_rm_int<0x1C, "pf2iw", WriteCvtF2I, "a">; -defm PI2FW : I3DNow_conv_rm_int<0x0C, "pi2fw", WriteCvtI2F, "a">; +defm PF2IW : I3DNow_conv_rm_int<0x1C, "pf2iw", WriteCvtPS2I, "a">; +defm PI2FW : I3DNow_conv_rm_int<0x0C, "pi2fw", WriteCvtI2PS, "a">; defm PFNACC : I3DNow_binop_rm_int<0x8A, "pfnacc", WriteFAdd, 0, "a">; defm PFPNACC : I3DNow_binop_rm_int<0x8E, "pfpnacc", WriteFAdd, 0, "a">; defm PSWAPD : I3DNow_conv_rm_int<0xBB, "pswapd", SchedWriteShuffle.MMX, "a">; diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 6b601727db3..1a3e3f022ab 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -6750,16 +6750,16 @@ multiclass avx512_vcvtsi_common<bits<8> opc, SDNode OpNode, } let Predicates = [HasAVX512] in { -defm VCVTSI2SSZ : avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2F, GR32, +defm VCVTSI2SSZ : avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2SS, GR32, v4f32x_info, i32mem, loadi32, "cvtsi2ss{l}">, XS, EVEX_CD8<32, CD8VT1>; -defm VCVTSI642SSZ: avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2F, GR64, +defm VCVTSI642SSZ: avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2SS, GR64, v4f32x_info, i64mem, loadi64, "cvtsi2ss{q}">, XS, VEX_W, EVEX_CD8<64, CD8VT1>; -defm VCVTSI2SDZ : avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2F, GR32, +defm VCVTSI2SDZ : avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2SD, GR32, v2f64x_info, i32mem, loadi32, "cvtsi2sd{l}">, XD, EVEX_CD8<32, CD8VT1>; -defm VCVTSI642SDZ: avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2F, GR64, +defm VCVTSI642SDZ: avx512_vcvtsi_common<0x2A, X86SintToFpRnd, WriteCvtI2SD, GR64, v2f64x_info, i64mem, loadi64, "cvtsi2sd{q}">, XD, VEX_W, EVEX_CD8<64, CD8VT1>; @@ -6786,16 +6786,16 @@ def : Pat<(f64 (sint_to_fp GR32:$src)), def : Pat<(f64 (sint_to_fp GR64:$src)), (VCVTSI642SDZrr (f64 (IMPLICIT_DEF)), GR64:$src)>; -defm VCVTUSI2SSZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, WriteCvtI2F, GR32, +defm VCVTUSI2SSZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, WriteCvtI2SS, GR32, v4f32x_info, i32mem, loadi32, "cvtusi2ss{l}">, XS, EVEX_CD8<32, CD8VT1>; -defm VCVTUSI642SSZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, WriteCvtI2F, GR64, +defm VCVTUSI642SSZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, WriteCvtI2SS, GR64, v4f32x_info, i64mem, loadi64, "cvtusi2ss{q}">, XS, VEX_W, EVEX_CD8<64, CD8VT1>; -defm VCVTUSI2SDZ : avx512_vcvtsi<0x7B, X86UintToFpRnd, WriteCvtI2F, GR32, v2f64x_info, +defm VCVTUSI2SDZ : avx512_vcvtsi<0x7B, X86UintToFpRnd, WriteCvtI2SD, GR32, v2f64x_info, i32mem, loadi32, "cvtusi2sd{l}">, XD, VEX_LIG, EVEX_CD8<32, CD8VT1>; -defm VCVTUSI642SDZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, WriteCvtI2F, GR64, +defm VCVTUSI642SDZ : avx512_vcvtsi_common<0x7B, X86UintToFpRnd, WriteCvtI2SD, GR64, v2f64x_info, i64mem, loadi64, "cvtusi2sd{q}">, XD, VEX_W, EVEX_CD8<64, CD8VT1>; @@ -6871,28 +6871,28 @@ multiclass avx512_cvt_s_int_round_aliases<bits<8> opc, X86VectorVTInfo SrcVT, // Convert float/double to signed/unsigned int 32/64 defm VCVTSS2SIZ: avx512_cvt_s_int_round<0x2D, f32x_info, i32x_info, - X86cvts2si, WriteCvtF2I, "cvtss2si", "{l}">, + X86cvts2si, WriteCvtSS2I, "cvtss2si", "{l}">, XS, EVEX_CD8<32, CD8VT1>; defm VCVTSS2SI64Z: avx512_cvt_s_int_round<0x2D, f32x_info, i64x_info, - X86cvts2si, WriteCvtF2I, "cvtss2si", "{q}">, + X86cvts2si, WriteCvtSS2I, "cvtss2si", "{q}">, XS, VEX_W, EVEX_CD8<32, CD8VT1>; defm VCVTSS2USIZ: avx512_cvt_s_int_round_aliases<0x79, f32x_info, i32x_info, - X86cvts2usi, WriteCvtF2I, "cvtss2usi", "{l}">, + X86cvts2usi, WriteCvtSS2I, "cvtss2usi", "{l}">, XS, EVEX_CD8<32, CD8VT1>; defm VCVTSS2USI64Z: avx512_cvt_s_int_round_aliases<0x79, f32x_info, i64x_info, - X86cvts2usi, WriteCvtF2I, "cvtss2usi", "{q}">, + X86cvts2usi, WriteCvtSS2I, "cvtss2usi", "{q}">, XS, VEX_W, EVEX_CD8<32, CD8VT1>; defm VCVTSD2SIZ: avx512_cvt_s_int_round<0x2D, f64x_info, i32x_info, - X86cvts2si, WriteCvtF2I, "cvtsd2si", "{l}">, + X86cvts2si, WriteCvtSD2I, "cvtsd2si", "{l}">, XD, EVEX_CD8<64, CD8VT1>; defm VCVTSD2SI64Z: avx512_cvt_s_int_round<0x2D, f64x_info, i64x_info, - X86cvts2si, WriteCvtF2I, "cvtsd2si", "{q}">, + X86cvts2si, WriteCvtSD2I, "cvtsd2si", "{q}">, XD, VEX_W, EVEX_CD8<64, CD8VT1>; defm VCVTSD2USIZ: avx512_cvt_s_int_round_aliases<0x79, f64x_info, i32x_info, - X86cvts2usi, WriteCvtF2I, "cvtsd2usi", "{l}">, + X86cvts2usi, WriteCvtSD2I, "cvtsd2usi", "{l}">, XD, EVEX_CD8<64, CD8VT1>; defm VCVTSD2USI64Z: avx512_cvt_s_int_round_aliases<0x79, f64x_info, i64x_info, - X86cvts2usi, WriteCvtF2I, "cvtsd2usi", "{q}">, + X86cvts2usi, WriteCvtSD2I, "cvtsd2usi", "{q}">, XD, VEX_W, EVEX_CD8<64, CD8VT1>; // The SSE version of these instructions are disabled for AVX512. @@ -7058,29 +7058,29 @@ let Predicates = [HasAVX512] in { } defm VCVTTSS2SIZ: avx512_cvt_s_all<0x2C, "vcvttss2si", f32x_info, i32x_info, - fp_to_sint, X86cvtts2IntRnd, WriteCvtF2I, "{l}">, + fp_to_sint, X86cvtts2IntRnd, WriteCvtSS2I, "{l}">, XS, EVEX_CD8<32, CD8VT1>; defm VCVTTSS2SI64Z: avx512_cvt_s_all<0x2C, "vcvttss2si", f32x_info, i64x_info, - fp_to_sint, X86cvtts2IntRnd, WriteCvtF2I, "{q}">, + fp_to_sint, X86cvtts2IntRnd, WriteCvtSS2I, "{q}">, VEX_W, XS, EVEX_CD8<32, CD8VT1>; defm VCVTTSD2SIZ: avx512_cvt_s_all<0x2C, "vcvttsd2si", f64x_info, i32x_info, - fp_to_sint, X86cvtts2IntRnd, WriteCvtF2I, "{l}">, + fp_to_sint, X86cvtts2IntRnd, WriteCvtSD2I, "{l}">, XD, EVEX_CD8<64, CD8VT1>; defm VCVTTSD2SI64Z: avx512_cvt_s_all<0x2C, "vcvttsd2si", f64x_info, i64x_info, - fp_to_sint, X86cvtts2IntRnd, WriteCvtF2I, "{q}">, + fp_to_sint, X86cvtts2IntRnd, WriteCvtSD2I, "{q}">, VEX_W, XD, EVEX_CD8<64, CD8VT1>; defm VCVTTSS2USIZ: avx512_cvt_s_all_unsigned<0x78, "vcvttss2usi", f32x_info, i32x_info, - fp_to_uint, X86cvtts2UIntRnd, WriteCvtF2I, "{l}">, + fp_to_uint, X86cvtts2UIntRnd, WriteCvtSS2I, "{l}">, XS, EVEX_CD8<32, CD8VT1>; defm VCVTTSS2USI64Z: avx512_cvt_s_all_unsigned<0x78, "vcvttss2usi", f32x_info, i64x_info, - fp_to_uint, X86cvtts2UIntRnd, WriteCvtF2I, "{q}">, + fp_to_uint, X86cvtts2UIntRnd, WriteCvtSS2I, "{q}">, XS,VEX_W, EVEX_CD8<32, CD8VT1>; defm VCVTTSD2USIZ: avx512_cvt_s_all_unsigned<0x78, "vcvttsd2usi", f64x_info, i32x_info, - fp_to_uint, X86cvtts2UIntRnd, WriteCvtF2I, "{l}">, + fp_to_uint, X86cvtts2UIntRnd, WriteCvtSD2I, "{l}">, XD, EVEX_CD8<64, CD8VT1>; defm VCVTTSD2USI64Z: avx512_cvt_s_all_unsigned<0x78, "vcvttsd2usi", f64x_info, i64x_info, - fp_to_uint, X86cvtts2UIntRnd, WriteCvtF2I, "{q}">, + fp_to_uint, X86cvtts2UIntRnd, WriteCvtSD2I, "{q}">, XD, VEX_W, EVEX_CD8<64, CD8VT1>; let Predicates = [HasAVX512] in { @@ -7341,80 +7341,80 @@ let Predicates = [HasVLX] in { // Convert Signed/Unsigned Doubleword to Double multiclass avx512_cvtdq2pd<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNode128, X86FoldableSchedWrite sched> { + SDNode OpNode128, X86SchedWriteWidths sched> { // No rounding in this op let Predicates = [HasAVX512] in defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f64_info, v8i32x_info, OpNode, - sched>, EVEX_V512; + sched.ZMM>, EVEX_V512; let Predicates = [HasVLX] in { defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2f64x_info, v4i32x_info, - OpNode128, sched, "{1to2}", "", i64mem>, EVEX_V128; + OpNode128, sched.XMM, "{1to2}", "", i64mem>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f64x_info, v4i32x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Signed/Unsigned Doubleword to Float multiclass avx512_cvtdq2ps<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasAVX512] in defm Z : avx512_vcvt_fp<opc, OpcodeStr, v16f32_info, v16i32_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_rc<opc, OpcodeStr, v16f32_info, v16i32_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; let Predicates = [HasVLX] in { defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v4i32x_info, OpNode, - sched>, EVEX_V128; + sched.XMM>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v8f32x_info, v8i32x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Float to Signed/Unsigned Doubleword with truncation multiclass avx512_cvttps2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasAVX512] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v16i32_info, v16f32_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_sae<opc, OpcodeStr, v16i32_info, v16f32_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasVLX] in { defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f32x_info, OpNode, - sched>, EVEX_V128; + sched.XMM>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f32x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Float to Signed/Unsigned Doubleword multiclass avx512_cvtps2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasAVX512] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v16i32_info, v16f32_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_rc<opc, OpcodeStr, v16i32_info, v16f32_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasVLX] in { defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f32x_info, OpNode, - sched>, EVEX_V128; + sched.XMM>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f32x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Double to Signed/Unsigned Doubleword with truncation multiclass avx512_cvttpd2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, SDNode OpNode128, SDNode OpNodeRnd, - X86FoldableSchedWrite sched> { + X86SchedWriteWidths sched> { let Predicates = [HasAVX512] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f64_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_sae<opc, OpcodeStr, v8i32x_info, v8f64_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasVLX] in { // we need "x"/"y" suffixes in order to distinguish between 128 and 256 @@ -7422,9 +7422,9 @@ multiclass avx512_cvttpd2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, // dest type - 'v4i32x_info'. We also specify the broadcast string explicitly // due to the same reason. defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v2f64x_info, - OpNode128, sched, "{1to2}", "{x}">, EVEX_V128; + OpNode128, sched.XMM, "{1to2}", "{x}">, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f64x_info, OpNode, - sched, "{1to4}", "{y}">, EVEX_V256; + sched.YMM, "{1to4}", "{y}">, EVEX_V256; def : InstAlias<OpcodeStr##"x\t{$src, $dst|$dst, $src}", (!cast<Instruction>(NAME # "Z128rr") VR128X:$dst, VR128X:$src), 0>; @@ -7439,12 +7439,12 @@ multiclass avx512_cvttpd2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, // Convert Double to Signed/Unsigned Doubleword multiclass avx512_cvtpd2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasAVX512] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i32x_info, v8f64_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_rc<opc, OpcodeStr, v8i32x_info, v8f64_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasVLX] in { // we need "x"/"y" suffixes in order to distinguish between 128 and 256 @@ -7452,9 +7452,9 @@ multiclass avx512_cvtpd2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, // dest type - 'v4i32x_info'. We also specify the broadcast string explicitly // due to the same reason. defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v2f64x_info, OpNode, - sched, "{1to2}", "{x}">, EVEX_V128; + sched.XMM, "{1to2}", "{x}">, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i32x_info, v4f64x_info, OpNode, - sched, "{1to4}", "{y}">, EVEX_V256; + sched.YMM, "{1to4}", "{y}">, EVEX_V256; def : InstAlias<OpcodeStr##"x\t{$src, $dst|$dst, $src}", (!cast<Instruction>(NAME # "Z128rr") VR128X:$dst, VR128X:$src), 0>; @@ -7469,102 +7469,102 @@ multiclass avx512_cvtpd2dq<bits<8> opc, string OpcodeStr, SDNode OpNode, // Convert Double to Signed/Unsigned Quardword multiclass avx512_cvtpd2qq<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasDQI] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f64_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_rc<opc, OpcodeStr, v8i64_info, v8f64_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasDQI, HasVLX] in { defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v2f64x_info, OpNode, - sched>, EVEX_V128; + sched.XMM>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f64x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Double to Signed/Unsigned Quardword with truncation multiclass avx512_cvttpd2qq<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasDQI] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f64_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_sae<opc, OpcodeStr, v8i64_info, v8f64_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasDQI, HasVLX] in { defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v2f64x_info, OpNode, - sched>, EVEX_V128; + sched.XMM>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f64x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Signed/Unsigned Quardword to Double multiclass avx512_cvtqq2pd<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasDQI] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f64_info, v8i64_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_rc<opc, OpcodeStr, v8f64_info, v8i64_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasDQI, HasVLX] in { defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2f64x_info, v2i64x_info, OpNode, - sched>, EVEX_V128; + sched.XMM>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f64x_info, v4i64x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Float to Signed/Unsigned Quardword multiclass avx512_cvtps2qq<bits<8> opc, string OpcodeStr, SDNode OpNode, - SDNode OpNodeRnd, X86FoldableSchedWrite sched> { + SDNode OpNodeRnd, X86SchedWriteWidths sched> { let Predicates = [HasDQI] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f32x_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_rc<opc, OpcodeStr, v8i64_info, v8f32x_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasDQI, HasVLX] in { // Explicitly specified broadcast string, since we take only 2 elements // from v4f32x_info source defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v4f32x_info, OpNode, - sched, "{1to2}", "", f64mem>, EVEX_V128; + sched.XMM, "{1to2}", "", f64mem>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f32x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Float to Signed/Unsigned Quardword with truncation multiclass avx512_cvttps2qq<bits<8> opc, string OpcodeStr, SDNode OpNode, SDNode OpNode128, SDNode OpNodeRnd, - X86FoldableSchedWrite sched> { + X86SchedWriteWidths sched> { let Predicates = [HasDQI] in { - defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f32x_info, OpNode, sched>, + defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8i64_info, v8f32x_info, OpNode, sched.ZMM>, avx512_vcvt_fp_sae<opc, OpcodeStr, v8i64_info, v8f32x_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasDQI, HasVLX] in { // Explicitly specified broadcast string, since we take only 2 elements // from v4f32x_info source defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v2i64x_info, v4f32x_info, OpNode128, - sched, "{1to2}", "", f64mem>, EVEX_V128; + sched.XMM, "{1to2}", "", f64mem>, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4i64x_info, v4f32x_info, OpNode, - sched>, EVEX_V256; + sched.YMM>, EVEX_V256; } } // Convert Signed/Unsigned Quardword to Float multiclass avx512_cvtqq2ps<bits<8> opc, string OpcodeStr, SDNode OpNode, SDNode OpNode128, SDNode OpNodeRnd, - X86FoldableSchedWrite sched> { + X86SchedWriteWidths sched> { let Predicates = [HasDQI] in { defm Z : avx512_vcvt_fp<opc, OpcodeStr, v8f32x_info, v8i64_info, OpNode, - sched>, + sched.ZMM>, avx512_vcvt_fp_rc<opc, OpcodeStr, v8f32x_info, v8i64_info, - OpNodeRnd, sched>, EVEX_V512; + OpNodeRnd, sched.ZMM>, EVEX_V512; } let Predicates = [HasDQI, HasVLX] in { // we need "x"/"y" suffixes in order to distinguish between 128 and 256 @@ -7572,9 +7572,9 @@ multiclass avx512_cvtqq2ps<bits<8> opc, string OpcodeStr, SDNode OpNode, // dest type - 'v4i32x_info'. We also specify the broadcast string explicitly // due to the same reason. defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v2i64x_info, OpNode128, - sched, "{1to2}", "{x}">, EVEX_V128; + sched.XMM, "{1to2}", "{x}">, EVEX_V128; defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v4f32x_info, v4i64x_info, OpNode, - sched, "{1to4}", "{y}">, EVEX_V256; + sched.YMM, "{1to4}", "{y}">, EVEX_V256; def : InstAlias<OpcodeStr##"x\t{$src, $dst|$dst, $src}", (!cast<Instruction>(NAME # "Z128rr") VR128X:$dst, VR128X:$src), 0>; @@ -7588,98 +7588,98 @@ multiclass avx512_cvtqq2ps<bits<8> opc, string OpcodeStr, SDNode OpNode, } defm VCVTDQ2PD : avx512_cvtdq2pd<0xE6, "vcvtdq2pd", sint_to_fp, X86VSintToFP, - WriteCvtI2F>, XS, EVEX_CD8<32, CD8VH>; + SchedWriteCvtDQ2PD>, XS, EVEX_CD8<32, CD8VH>; defm VCVTDQ2PS : avx512_cvtdq2ps<0x5B, "vcvtdq2ps", sint_to_fp, - X86VSintToFpRnd, WriteCvtI2F>, + X86VSintToFpRnd, SchedWriteCvtDQ2PS>, PS, EVEX_CD8<32, CD8VF>; defm VCVTTPS2DQ : avx512_cvttps2dq<0x5B, "vcvttps2dq", fp_to_sint, - X86cvttp2siRnd, WriteCvtF2I>, + X86cvttp2siRnd, SchedWriteCvtPS2DQ>, XS, EVEX_CD8<32, CD8VF>; defm VCVTTPD2DQ : avx512_cvttpd2dq<0xE6, "vcvttpd2dq", fp_to_sint, X86cvttp2si, - X86cvttp2siRnd, WriteCvtF2I>, + X86cvttp2siRnd, SchedWriteCvtPD2DQ>, PD, VEX_W, EVEX_CD8<64, CD8VF>; defm VCVTTPS2UDQ : avx512_cvttps2dq<0x78, "vcvttps2udq", fp_to_uint, - X86cvttp2uiRnd, WriteCvtF2I>, PS, + X86cvttp2uiRnd, SchedWriteCvtPS2DQ>, PS, EVEX_CD8<32, CD8VF>; defm VCVTTPD2UDQ : avx512_cvttpd2dq<0x78, "vcvttpd2udq", fp_to_uint, - X86cvttp2ui, X86cvttp2uiRnd, WriteCvtF2I>, + X86cvttp2ui, X86cvttp2uiRnd, SchedWriteCvtPD2DQ>, PS, VEX_W, EVEX_CD8<64, CD8VF>; defm VCVTUDQ2PD : avx512_cvtdq2pd<0x7A, "vcvtudq2pd", uint_to_fp, - X86VUintToFP, WriteCvtI2F>, XS, + X86VUintToFP, SchedWriteCvtDQ2PD>, XS, EVEX_CD8<32, CD8VH>; defm VCVTUDQ2PS : avx512_cvtdq2ps<0x7A, "vcvtudq2ps", uint_to_fp, - X86VUintToFpRnd, WriteCvtI2F>, XD, + X86VUintToFpRnd, SchedWriteCvtDQ2PS>, XD, EVEX_CD8<32, CD8VF>; defm VCVTPS2DQ : avx512_cvtps2dq<0x5B, "vcvtps2dq", X86cvtp2Int, - X86cvtp2IntRnd, WriteCvtF2I>, PD, + X86cvtp2IntRnd, SchedWriteCvtPS2DQ>, PD, EVEX_CD8<32, CD8VF>; defm VCVTPD2DQ : avx512_cvtpd2dq<0xE6, "vcvtpd2dq", X86cvtp2Int, - X86cvtp2IntRnd, WriteCvtF2I>, XD, + X86cvtp2IntRnd, SchedWriteCvtPD2DQ>, XD, VEX_W, EVEX_CD8<64, CD8VF>; defm VCVTPS2UDQ : avx512_cvtps2dq<0x79, "vcvtps2udq", X86cvtp2UInt, - X86cvtp2UIntRnd, WriteCvtF2I>, + X86cvtp2UIntRnd, SchedWriteCvtPS2DQ>, PS, EVEX_CD8<32, CD8VF>; defm VCVTPD2UDQ : avx512_cvtpd2dq<0x79, "vcvtpd2udq", X86cvtp2UInt, - X86cvtp2UIntRnd, WriteCvtF2I>, VEX_W, + X86cvtp2UIntRnd, SchedWriteCvtPD2DQ>, VEX_W, PS, EVEX_CD8<64, CD8VF>; defm VCVTPD2QQ : avx512_cvtpd2qq<0x7B, "vcvtpd2qq", X86cvtp2Int, - X86cvtp2IntRnd, WriteCvtF2I>, VEX_W, + X86cvtp2IntRnd, SchedWriteCvtPD2DQ>, VEX_W, PD, EVEX_CD8<64, CD8VF>; defm VCVTPS2QQ : avx512_cvtps2qq<0x7B, "vcvtps2qq", X86cvtp2Int, - X86cvtp2IntRnd, WriteCvtF2I>, PD, + X86cvtp2IntRnd, SchedWriteCvtPS2DQ>, PD, EVEX_CD8<32, CD8VH>; defm VCVTPD2UQQ : avx512_cvtpd2qq<0x79, "vcvtpd2uqq", X86cvtp2UInt, - X86cvtp2UIntRnd, WriteCvtF2I>, VEX_W, + X86cvtp2UIntRnd, SchedWriteCvtPD2DQ>, VEX_W, PD, EVEX_CD8<64, CD8VF>; defm VCVTPS2UQQ : avx512_cvtps2qq<0x79, "vcvtps2uqq", X86cvtp2UInt, - X86cvtp2UIntRnd, WriteCvtF2I>, PD, + X86cvtp2UIntRnd, SchedWriteCvtPS2DQ>, PD, EVEX_CD8<32, CD8VH>; defm VCVTTPD2QQ : avx512_cvttpd2qq<0x7A, "vcvttpd2qq", fp_to_sint, - X86cvttp2siRnd, WriteCvtF2I>, VEX_W, + X86cvttp2siRnd, SchedWriteCvtPD2DQ>, VEX_W, PD, EVEX_CD8<64, CD8VF>; defm VCVTTPS2QQ : avx512_cvttps2qq<0x7A, "vcvttps2qq", fp_to_sint, X86cvttp2si, - X86cvttp2siRnd, WriteCvtF2I>, PD, + X86cvttp2siRnd, SchedWriteCvtPS2DQ>, PD, EVEX_CD8<32, CD8VH>; defm VCVTTPD2UQQ : avx512_cvttpd2qq<0x78, "vcvttpd2uqq", fp_to_uint, - X86cvttp2uiRnd, WriteCvtF2I>, VEX_W, + X86cvttp2uiRnd, SchedWriteCvtPD2DQ>, VEX_W, PD, EVEX_CD8<64, CD8VF>; defm VCVTTPS2UQQ : avx512_cvttps2qq<0x78, "vcvttps2uqq", fp_to_uint, X86cvttp2ui, - X86cvttp2uiRnd, WriteCvtF2I>, PD, + X86cvttp2uiRnd, SchedWriteCvtPS2DQ>, PD, EVEX_CD8<32, CD8VH>; defm VCVTQQ2PD : avx512_cvtqq2pd<0xE6, "vcvtqq2pd", sint_to_fp, - X86VSintToFpRnd, WriteCvtI2F>, VEX_W, XS, + X86VSintToFpRnd, SchedWriteCvtDQ2PD>, VEX_W, XS, EVEX_CD8<64, CD8VF>; defm VCVTUQQ2PD : avx512_cvtqq2pd<0x7A, "vcvtuqq2pd", uint_to_fp, - X86VUintToFpRnd, WriteCvtI2F>, VEX_W, XS, + X86VUintToFpRnd, SchedWriteCvtDQ2PD>, VEX_W, XS, EVEX_CD8<64, CD8VF>; defm VCVTQQ2PS : avx512_cvtqq2ps<0x5B, "vcvtqq2ps", sint_to_fp, X86VSintToFP, - X86VSintToFpRnd, WriteCvtI2F>, VEX_W, PS, + X86VSintToFpRnd, SchedWriteCvtDQ2PS>, VEX_W, PS, EVEX_CD8<64, CD8VF>; defm VCVTUQQ2PS : avx512_cvtqq2ps<0x7A, "vcvtuqq2ps", uint_to_fp, X86VUintToFP, - X86VUintToFpRnd, WriteCvtI2F>, VEX_W, XD, + X86VUintToFpRnd, SchedWriteCvtDQ2PS>, VEX_W, XD, EVEX_CD8<64, CD8VF>; let Predicates = [HasAVX512, NoVLX] in { diff --git a/llvm/lib/Target/X86/X86InstrMMX.td b/llvm/lib/Target/X86/X86InstrMMX.td index c716bbc1141..02938b5ec31 100644 --- a/llvm/lib/Target/X86/X86InstrMMX.td +++ b/llvm/lib/Target/X86/X86InstrMMX.td @@ -142,11 +142,11 @@ multiclass sse12_cvt_pint_3addr<bits<8> opc, RegisterClass SrcRC, def irr : MMXPI<opc, MRMSrcReg, (outs DstRC:$dst), (ins DstRC:$src1, SrcRC:$src2), asm, [(set DstRC:$dst, (Int DstRC:$src1, SrcRC:$src2))], d>, - Sched<[WriteCvtI2F]>; + Sched<[WriteCvtI2PS]>; def irm : MMXPI<opc, MRMSrcMem, (outs DstRC:$dst), (ins DstRC:$src1, x86memop:$src2), asm, [(set DstRC:$dst, (Int DstRC:$src1, (ld_frag addr:$src2)))], d>, - Sched<[WriteCvtI2FLd]>; + Sched<[WriteCvtI2PS.Folded]>; } //===----------------------------------------------------------------------===// @@ -512,19 +512,19 @@ def MMX_PSHUFWmi : MMXIi8<0x70, MRMSrcMem, // -- Conversion Instructions defm MMX_CVTPS2PI : sse12_cvt_pint<0x2D, VR128, VR64, int_x86_sse_cvtps2pi, f64mem, load, "cvtps2pi\t{$src, $dst|$dst, $src}", - WriteCvtF2I, SSEPackedSingle>, PS; + WriteCvtPS2I, SSEPackedSingle>, PS; defm MMX_CVTPD2PI : sse12_cvt_pint<0x2D, VR128, VR64, int_x86_sse_cvtpd2pi, f128mem, memop, "cvtpd2pi\t{$src, $dst|$dst, $src}", - WriteCvtF2I, SSEPackedDouble>, PD; + WriteCvtPD2I, SSEPackedDouble>, PD; defm MMX_CVTTPS2PI : sse12_cvt_pint<0x2C, VR128, VR64, int_x86_sse_cvttps2pi, f64mem, load, "cvttps2pi\t{$src, $dst|$dst, $src}", - WriteCvtF2I, SSEPackedSingle>, PS; + WriteCvtPS2I, SSEPackedSingle>, PS; defm MMX_CVTTPD2PI : sse12_cvt_pint<0x2C, VR128, VR64, int_x86_sse_cvttpd2pi, f128mem, memop, "cvttpd2pi\t{$src, $dst|$dst, $src}", - WriteCvtF2I, SSEPackedDouble>, PD; + WriteCvtPD2I, SSEPackedDouble>, PD; defm MMX_CVTPI2PD : sse12_cvt_pint<0x2A, VR64, VR128, int_x86_sse_cvtpi2pd, i64mem, load, "cvtpi2pd\t{$src, $dst|$dst, $src}", - WriteCvtI2F, SSEPackedDouble>, PD; + WriteCvtI2PD, SSEPackedDouble>, PD; let Constraints = "$src1 = $dst" in { defm MMX_CVTPI2PS : sse12_cvt_pint_3addr<0x2A, VR64, VR128, int_x86_sse_cvtpi2ps, diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td index 904147ba9ba..438fb84b094 100644 --- a/llvm/lib/Target/X86/X86InstrSSE.td +++ b/llvm/lib/Target/X86/X86InstrSSE.td @@ -945,19 +945,19 @@ let hasSideEffects = 0, Predicates = [UseAVX] in { let Predicates = [UseAVX] in { defm VCVTTSS2SI : sse12_cvt_s<0x2C, FR32, GR32, fp_to_sint, f32mem, loadf32, "cvttss2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, + WriteCvtSS2I>, XS, VEX, VEX_LIG; defm VCVTTSS2SI64 : sse12_cvt_s<0x2C, FR32, GR64, fp_to_sint, f32mem, loadf32, "cvttss2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, + WriteCvtSS2I>, XS, VEX, VEX_W, VEX_LIG; defm VCVTTSD2SI : sse12_cvt_s<0x2C, FR64, GR32, fp_to_sint, f64mem, loadf64, "cvttsd2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, + WriteCvtSD2I>, XD, VEX, VEX_LIG; defm VCVTTSD2SI64 : sse12_cvt_s<0x2C, FR64, GR64, fp_to_sint, f64mem, loadf64, "cvttsd2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, + WriteCvtSD2I>, XD, VEX, VEX_W, VEX_LIG; def : InstAlias<"vcvttss2si{l}\t{$src, $dst|$dst, $src}", @@ -982,13 +982,13 @@ def : InstAlias<"vcvttsd2si{q}\t{$src, $dst|$dst, $src}", // provide other assembly "l" and "q" forms to address this explicitly // where appropriate to do so. defm VCVTSI2SS : sse12_vcvt_avx<0x2A, GR32, FR32, i32mem, "cvtsi2ss{l}", - WriteCvtI2F>, XS, VEX_4V, VEX_LIG; + WriteCvtI2SS>, XS, VEX_4V, VEX_LIG; defm VCVTSI642SS : sse12_vcvt_avx<0x2A, GR64, FR32, i64mem, "cvtsi2ss{q}", - WriteCvtI2F>, XS, VEX_4V, VEX_W, VEX_LIG; + WriteCvtI2SS>, XS, VEX_4V, VEX_W, VEX_LIG; defm VCVTSI2SD : sse12_vcvt_avx<0x2A, GR32, FR64, i32mem, "cvtsi2sd{l}", - WriteCvtI2F>, XD, VEX_4V, VEX_LIG; + WriteCvtI2SD>, XD, VEX_4V, VEX_LIG; defm VCVTSI642SD : sse12_vcvt_avx<0x2A, GR64, FR64, i64mem, "cvtsi2sd{q}", - WriteCvtI2F>, XD, VEX_4V, VEX_W, VEX_LIG; + WriteCvtI2SD>, XD, VEX_4V, VEX_W, VEX_LIG; let Predicates = [UseAVX] in { def : InstAlias<"vcvtsi2ss\t{$src, $src1, $dst|$dst, $src1, $src}", @@ -1017,28 +1017,28 @@ let Predicates = [UseAVX] in { defm CVTTSS2SI : sse12_cvt_s<0x2C, FR32, GR32, fp_to_sint, f32mem, loadf32, "cvttss2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, XS; + WriteCvtSS2I>, XS; defm CVTTSS2SI64 : sse12_cvt_s<0x2C, FR32, GR64, fp_to_sint, f32mem, loadf32, "cvttss2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, XS, REX_W; + WriteCvtSS2I>, XS, REX_W; defm CVTTSD2SI : sse12_cvt_s<0x2C, FR64, GR32, fp_to_sint, f64mem, loadf64, "cvttsd2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, XD; + WriteCvtSD2I>, XD; defm CVTTSD2SI64 : sse12_cvt_s<0x2C, FR64, GR64, fp_to_sint, f64mem, loadf64, "cvttsd2si\t{$src, $dst|$dst, $src}", - WriteCvtF2I>, XD, REX_W; + WriteCvtSD2I>, XD, REX_W; defm CVTSI2SS : sse12_cvt_s<0x2A, GR32, FR32, sint_to_fp, i32mem, loadi32, "cvtsi2ss{l}\t{$src, $dst|$dst, $src}", - WriteCvtI2F>, XS; + WriteCvtI2SS>, XS; defm CVTSI642SS : sse12_cvt_s<0x2A, GR64, FR32, sint_to_fp, i64mem, loadi64, "cvtsi2ss{q}\t{$src, $dst|$dst, $src}", - WriteCvtI2F>, XS, REX_W; + WriteCvtI2SS>, XS, REX_W; defm CVTSI2SD : sse12_cvt_s<0x2A, GR32, FR64, sint_to_fp, i32mem, loadi32, "cvtsi2sd{l}\t{$src, $dst|$dst, $src}", - WriteCvtI2F>, XD; + WriteCvtI2SD>, XD; defm CVTSI642SD : sse12_cvt_s<0x2A, GR64, FR64, sint_to_fp, i64mem, loadi64, "cvtsi2sd{q}\t{$src, $dst|$dst, $src}", - WriteCvtI2F>, XD, REX_W; + WriteCvtI2SD>, XD, REX_W; def : InstAlias<"cvttss2si{l}\t{$src, $dst|$dst, $src}", (CVTTSS2SIrr GR32:$dst, FR32:$src), 0, "att">; @@ -1103,37 +1103,37 @@ let hasSideEffects = 0 in { let Predicates = [UseAVX] in { defm VCVTSD2SI : sse12_cvt_sint<0x2D, VR128, GR32, int_x86_sse2_cvtsd2si, sdmem, sse_load_f64, "cvtsd2si", - WriteCvtF2I>, XD, VEX, VEX_LIG; + WriteCvtSD2I>, XD, VEX, VEX_LIG; defm VCVTSD2SI64 : sse12_cvt_sint<0x2D, VR128, GR64, int_x86_sse2_cvtsd2si64, sdmem, sse_load_f64, "cvtsd2si", - WriteCvtF2I>, XD, VEX, VEX_W, VEX_LIG; + WriteCvtSD2I>, XD, VEX, VEX_W, VEX_LIG; } defm CVTSD2SI : sse12_cvt_sint<0x2D, VR128, GR32, int_x86_sse2_cvtsd2si, - sdmem, sse_load_f64, "cvtsd2si", WriteCvtF2I>, XD; + sdmem, sse_load_f64, "cvtsd2si", WriteCvtSD2I>, XD; defm CVTSD2SI64 : sse12_cvt_sint<0x2D, VR128, GR64, int_x86_sse2_cvtsd2si64, - sdmem, sse_load_f64, "cvtsd2si", WriteCvtF2I>, XD, REX_W; + sdmem, sse_load_f64, "cvtsd2si", WriteCvtSD2I>, XD, REX_W; let isCodeGenOnly = 1 in { let Predicates = [UseAVX] in { defm VCVTSI2SS : sse12_cvt_sint_3addr<0x2A, GR32, VR128, - i32mem, "cvtsi2ss{l}", WriteCvtI2F, 0>, XS, VEX_4V; + i32mem, "cvtsi2ss{l}", WriteCvtI2SS, 0>, XS, VEX_4V; defm VCVTSI642SS : sse12_cvt_sint_3addr<0x2A, GR64, VR128, - i64mem, "cvtsi2ss{q}", WriteCvtI2F, 0>, XS, VEX_4V, VEX_W; + i64mem, "cvtsi2ss{q}", WriteCvtI2SS, 0>, XS, VEX_4V, VEX_W; defm VCVTSI2SD : sse12_cvt_sint_3addr<0x2A, GR32, VR128, - i32mem, "cvtsi2sd{l}", WriteCvtI2F, 0>, XD, VEX_4V; + i32mem, "cvtsi2sd{l}", WriteCvtI2SD, 0>, XD, VEX_4V; defm VCVTSI642SD : sse12_cvt_sint_3addr<0x2A, GR64, VR128, - i64mem, "cvtsi2sd{q}", WriteCvtI2F, 0>, XD, VEX_4V, VEX_W; + i64mem, "cvtsi2sd{q}", WriteCvtI2SD, 0>, XD, VEX_4V, VEX_W; } let Constraints = "$src1 = $dst" in { defm CVTSI2SS : sse12_cvt_sint_3addr<0x2A, GR32, VR128, - i32mem, "cvtsi2ss{l}", WriteCvtI2F>, XS; + i32mem, "cvtsi2ss{l}", WriteCvtI2SS>, XS; defm CVTSI642SS : sse12_cvt_sint_3addr<0x2A, GR64, VR128, - i64mem, "cvtsi2ss{q}", WriteCvtI2F>, XS, REX_W; + i64mem, "cvtsi2ss{q}", WriteCvtI2SS>, XS, REX_W; defm CVTSI2SD : sse12_cvt_sint_3addr<0x2A, GR32, VR128, - i32mem, "cvtsi2sd{l}", WriteCvtI2F>, XD; + i32mem, "cvtsi2sd{l}", WriteCvtI2SD>, XD; defm CVTSI642SD : sse12_cvt_sint_3addr<0x2A, GR64, VR128, - i64mem, "cvtsi2sd{q}", WriteCvtI2F>, XD, REX_W; + i64mem, "cvtsi2sd{q}", WriteCvtI2SD>, XD, REX_W; } } // isCodeGenOnly = 1 @@ -1144,60 +1144,60 @@ let isCodeGenOnly = 1 in { let Predicates = [UseAVX] in { defm VCVTTSS2SI : sse12_cvt_sint<0x2C, VR128, GR32, int_x86_sse_cvttss2si, ssmem, sse_load_f32, "cvttss2si", - WriteCvtF2I>, XS, VEX; + WriteCvtSS2I>, XS, VEX; defm VCVTTSS2SI64 : sse12_cvt_sint<0x2C, VR128, GR64, int_x86_sse_cvttss2si64, ssmem, sse_load_f32, - "cvttss2si", WriteCvtF2I>, + "cvttss2si", WriteCvtSS2I>, XS, VEX, VEX_W; defm VCVTTSD2SI : sse12_cvt_sint<0x2C, VR128, GR32, int_x86_sse2_cvttsd2si, sdmem, sse_load_f64, "cvttsd2si", - WriteCvtF2I>, XD, VEX; + WriteCvtSS2I>, XD, VEX; defm VCVTTSD2SI64 : sse12_cvt_sint<0x2C, VR128, GR64, int_x86_sse2_cvttsd2si64, sdmem, sse_load_f64, - "cvttsd2si", WriteCvtF2I>, + "cvttsd2si", WriteCvtSS2I>, XD, VEX, VEX_W; } defm CVTTSS2SI : sse12_cvt_sint<0x2C, VR128, GR32, int_x86_sse_cvttss2si, ssmem, sse_load_f32, "cvttss2si", - WriteCvtF2I>, XS; + WriteCvtSS2I>, XS; defm CVTTSS2SI64 : sse12_cvt_sint<0x2C, VR128, GR64, int_x86_sse_cvttss2si64, ssmem, sse_load_f32, - "cvttss2si", WriteCvtF2I>, XS, REX_W; + "cvttss2si", WriteCvtSS2I>, XS, REX_W; defm CVTTSD2SI : sse12_cvt_sint<0x2C, VR128, GR32, int_x86_sse2_cvttsd2si, sdmem, sse_load_f64, "cvttsd2si", - WriteCvtF2I>, XD; + WriteCvtSD2I>, XD; defm CVTTSD2SI64 : sse12_cvt_sint<0x2C, VR128, GR64, int_x86_sse2_cvttsd2si64, sdmem, sse_load_f64, - "cvttsd2si", WriteCvtF2I>, XD, REX_W; + "cvttsd2si", WriteCvtSD2I>, XD, REX_W; } // isCodeGenOnly = 1 let Predicates = [UseAVX] in { defm VCVTSS2SI : sse12_cvt_sint<0x2D, VR128, GR32, int_x86_sse_cvtss2si, ssmem, sse_load_f32, "cvtss2si", - WriteCvtF2I>, XS, VEX, VEX_LIG; + WriteCvtSS2I>, XS, VEX, VEX_LIG; defm VCVTSS2SI64 : sse12_cvt_sint<0x2D, VR128, GR64, int_x86_sse_cvtss2si64, ssmem, sse_load_f32, "cvtss2si", - WriteCvtF2I>, XS, VEX, VEX_W, VEX_LIG; + WriteCvtSS2I>, XS, VEX, VEX_W, VEX_LIG; } defm CVTSS2SI : sse12_cvt_sint<0x2D, VR128, GR32, int_x86_sse_cvtss2si, ssmem, sse_load_f32, "cvtss2si", - WriteCvtF2I>, XS; + WriteCvtSS2I>, XS; defm CVTSS2SI64 : sse12_cvt_sint<0x2D, VR128, GR64, int_x86_sse_cvtss2si64, ssmem, sse_load_f32, "cvtss2si", - WriteCvtF2I>, XS, REX_W; + WriteCvtSS2I>, XS, REX_W; defm VCVTDQ2PS : sse12_cvt_p<0x5B, VR128, i128mem, v4f32, v4i32, loadv2i64, "vcvtdq2ps\t{$src, $dst|$dst, $src}", - SSEPackedSingle, WriteCvtI2F>, + SSEPackedSingle, WriteCvtI2PS>, PS, VEX, Requires<[HasAVX, NoVLX]>, VEX_WIG; defm VCVTDQ2PSY : sse12_cvt_p<0x5B, VR256, i256mem, v8f32, v8i32, loadv4i64, "vcvtdq2ps\t{$src, $dst|$dst, $src}", - SSEPackedSingle, WriteCvtI2F>, + SSEPackedSingle, WriteCvtI2PSY>, PS, VEX, VEX_L, Requires<[HasAVX, NoVLX]>, VEX_WIG; defm CVTDQ2PS : sse12_cvt_p<0x5B, VR128, i128mem, v4f32, v4i32, memopv2i64, "cvtdq2ps\t{$src, $dst|$dst, $src}", - SSEPackedSingle, WriteCvtI2F>, + SSEPackedSingle, WriteCvtI2PS>, PS, Requires<[UseSSE2]>; let Predicates = [UseAVX] in { @@ -1492,32 +1492,32 @@ let Predicates = [HasAVX, NoVLX] in { def VCVTPS2DQrr : VPDI<0x5B, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvtps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (v4f32 VR128:$src))))]>, - VEX, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, Sched<[WriteCvtPS2I]>, VEX_WIG; def VCVTPS2DQrm : VPDI<0x5B, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src), "cvtps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (loadv4f32 addr:$src))))]>, - VEX, Sched<[WriteCvtF2ILd]>, VEX_WIG; + VEX, Sched<[WriteCvtPS2ILd]>, VEX_WIG; def VCVTPS2DQYrr : VPDI<0x5B, MRMSrcReg, (outs VR256:$dst), (ins VR256:$src), "cvtps2dq\t{$src, $dst|$dst, $src}", [(set VR256:$dst, (v8i32 (X86cvtp2Int (v8f32 VR256:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtPS2IY]>, VEX_WIG; def VCVTPS2DQYrm : VPDI<0x5B, MRMSrcMem, (outs VR256:$dst), (ins f256mem:$src), "cvtps2dq\t{$src, $dst|$dst, $src}", [(set VR256:$dst, (v8i32 (X86cvtp2Int (loadv8f32 addr:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtF2ILd]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtPS2IYLd]>, VEX_WIG; } def CVTPS2DQrr : PDI<0x5B, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvtps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (v4f32 VR128:$src))))]>, - Sched<[WriteCvtF2I]>; + Sched<[WriteCvtPS2I]>; def CVTPS2DQrm : PDI<0x5B, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src), "cvtps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (memopv4f32 addr:$src))))]>, - Sched<[WriteCvtF2ILd]>; + Sched<[WriteCvtPS2ILd]>; // Convert Packed Double FP to Packed DW Integers @@ -1529,7 +1529,7 @@ def VCVTPD2DQrr : SDI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "vcvtpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (v2f64 VR128:$src))))]>, - VEX, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, Sched<[WriteCvtPD2I]>, VEX_WIG; // XMM only def : InstAlias<"vcvtpd2dqx\t{$src, $dst|$dst, $src}", @@ -1538,7 +1538,7 @@ def VCVTPD2DQrm : SDI<0xE6, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src), "vcvtpd2dq{x}\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (loadv2f64 addr:$src))))]>, VEX, - Sched<[WriteCvtF2ILd]>, VEX_WIG; + Sched<[WriteCvtPD2ILd]>, VEX_WIG; def : InstAlias<"vcvtpd2dqx\t{$src, $dst|$dst, $src}", (VCVTPD2DQrm VR128:$dst, f128mem:$src), 0, "intel">; @@ -1547,12 +1547,12 @@ def VCVTPD2DQYrr : SDI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR256:$src), "vcvtpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (v4f64 VR256:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtPD2IY]>, VEX_WIG; def VCVTPD2DQYrm : SDI<0xE6, MRMSrcMem, (outs VR128:$dst), (ins f256mem:$src), "vcvtpd2dq{y}\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (loadv4f64 addr:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtF2ILd]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtPD2IYLd]>, VEX_WIG; def : InstAlias<"vcvtpd2dqy\t{$src, $dst|$dst, $src}", (VCVTPD2DQYrr VR128:$dst, VR256:$src), 0>; def : InstAlias<"vcvtpd2dqy\t{$src, $dst|$dst, $src}", @@ -1563,12 +1563,12 @@ def CVTPD2DQrm : SDI<0xE6, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src), "cvtpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (memopv2f64 addr:$src))))]>, - Sched<[WriteCvtF2ILd]>; + Sched<[WriteCvtPD2ILd]>; def CVTPD2DQrr : SDI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvtpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvtp2Int (v2f64 VR128:$src))))]>, - Sched<[WriteCvtF2I]>; + Sched<[WriteCvtPD2I]>; // Convert with truncation packed single/double fp to doubleword // SSE2 packed instructions with XS prefix @@ -1577,42 +1577,42 @@ def VCVTTPS2DQrr : VS2SI<0x5B, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvttps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (fp_to_sint (v4f32 VR128:$src))))]>, - VEX, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, Sched<[WriteCvtPS2I]>, VEX_WIG; def VCVTTPS2DQrm : VS2SI<0x5B, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src), "cvttps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (fp_to_sint (loadv4f32 addr:$src))))]>, - VEX, Sched<[WriteCvtF2ILd]>, VEX_WIG; + VEX, Sched<[WriteCvtPS2ILd]>, VEX_WIG; def VCVTTPS2DQYrr : VS2SI<0x5B, MRMSrcReg, (outs VR256:$dst), (ins VR256:$src), "cvttps2dq\t{$src, $dst|$dst, $src}", [(set VR256:$dst, (v8i32 (fp_to_sint (v8f32 VR256:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtPS2IY]>, VEX_WIG; def VCVTTPS2DQYrm : VS2SI<0x5B, MRMSrcMem, (outs VR256:$dst), (ins f256mem:$src), "cvttps2dq\t{$src, $dst|$dst, $src}", [(set VR256:$dst, (v8i32 (fp_to_sint (loadv8f32 addr:$src))))]>, VEX, VEX_L, - Sched<[WriteCvtF2ILd]>, VEX_WIG; + Sched<[WriteCvtPS2IYLd]>, VEX_WIG; } def CVTTPS2DQrr : S2SI<0x5B, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvttps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (fp_to_sint (v4f32 VR128:$src))))]>, - Sched<[WriteCvtF2I]>; + Sched<[WriteCvtPS2I]>; def CVTTPS2DQrm : S2SI<0x5B, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src), "cvttps2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (fp_to_sint (memopv4f32 addr:$src))))]>, - Sched<[WriteCvtF2ILd]>; + Sched<[WriteCvtPS2ILd]>; let Predicates = [HasAVX, NoVLX] in def VCVTTPD2DQrr : VPDI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvttpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvttp2si (v2f64 VR128:$src))))]>, - VEX, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, Sched<[WriteCvtPD2I]>, VEX_WIG; // The assembler can recognize rr 256-bit instructions by seeing a ymm // register, but the same isn't true when using memory operands instead. @@ -1626,7 +1626,7 @@ def VCVTTPD2DQrm : VPDI<0xE6, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src), "cvttpd2dq{x}\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvttp2si (loadv2f64 addr:$src))))]>, - VEX, Sched<[WriteCvtF2ILd]>, VEX_WIG; + VEX, Sched<[WriteCvtPD2ILd]>, VEX_WIG; def : InstAlias<"vcvttpd2dqx\t{$src, $dst|$dst, $src}", (VCVTTPD2DQrm VR128:$dst, f128mem:$src), 0, "intel">; @@ -1636,12 +1636,12 @@ def VCVTTPD2DQYrr : VPDI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR256:$src), "cvttpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (fp_to_sint (v4f64 VR256:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtF2I]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtPD2IY]>, VEX_WIG; def VCVTTPD2DQYrm : VPDI<0xE6, MRMSrcMem, (outs VR128:$dst), (ins f256mem:$src), "cvttpd2dq{y}\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (fp_to_sint (loadv4f64 addr:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtF2ILd]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtPD2IYLd]>, VEX_WIG; } def : InstAlias<"vcvttpd2dqy\t{$src, $dst|$dst, $src}", (VCVTTPD2DQYrr VR128:$dst, VR256:$src), 0>; @@ -1669,12 +1669,12 @@ def CVTTPD2DQrr : PDI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvttpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvttp2si (v2f64 VR128:$src))))]>, - Sched<[WriteCvtF2I]>; + Sched<[WriteCvtPD2I]>; def CVTTPD2DQrm : PDI<0xE6, MRMSrcMem, (outs VR128:$dst),(ins f128mem:$src), "cvttpd2dq\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v4i32 (X86cvttp2si (memopv2f64 addr:$src))))]>, - Sched<[WriteCvtF2ILd]>; + Sched<[WriteCvtPD2ILd]>; let Predicates = [UseSSE2] in { let AddedComplexity = 15 in { @@ -1732,23 +1732,23 @@ def VCVTDQ2PDrm : S2SI<0xE6, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src), "vcvtdq2pd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v2f64 (X86VSintToFP (bc_v4i32 (loadv2i64 addr:$src)))))]>, - VEX, Sched<[WriteCvtI2FLd]>, VEX_WIG; + VEX, Sched<[WriteCvtI2PDLd]>, VEX_WIG; def VCVTDQ2PDrr : S2SI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "vcvtdq2pd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v2f64 (X86VSintToFP (v4i32 VR128:$src))))]>, - VEX, Sched<[WriteCvtI2F]>, VEX_WIG; + VEX, Sched<[WriteCvtI2PD]>, VEX_WIG; def VCVTDQ2PDYrm : S2SI<0xE6, MRMSrcMem, (outs VR256:$dst), (ins i128mem:$src), "vcvtdq2pd\t{$src, $dst|$dst, $src}", [(set VR256:$dst, (v4f64 (sint_to_fp (bc_v4i32 (loadv2i64 addr:$src)))))]>, - VEX, VEX_L, Sched<[WriteCvtI2FLd]>, + VEX, VEX_L, Sched<[WriteCvtI2PDYLd]>, VEX_WIG; def VCVTDQ2PDYrr : S2SI<0xE6, MRMSrcReg, (outs VR256:$dst), (ins VR128:$src), "vcvtdq2pd\t{$src, $dst|$dst, $src}", [(set VR256:$dst, (v4f64 (sint_to_fp (v4i32 VR128:$src))))]>, - VEX, VEX_L, Sched<[WriteCvtI2F]>, VEX_WIG; + VEX, VEX_L, Sched<[WriteCvtI2PDY]>, VEX_WIG; } let hasSideEffects = 0, mayLoad = 1 in @@ -1756,12 +1756,12 @@ def CVTDQ2PDrm : S2SI<0xE6, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src), "cvtdq2pd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v2f64 (X86VSintToFP (bc_v4i32 (loadv2i64 addr:$src)))))]>, - Sched<[WriteCvtI2FLd]>; + Sched<[WriteCvtI2PDLd]>; def CVTDQ2PDrr : S2SI<0xE6, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src), "cvtdq2pd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (v2f64 (X86VSintToFP (v4i32 VR128:$src))))]>, - Sched<[WriteCvtI2F]>; + Sched<[WriteCvtI2PD]>; // AVX register conversion intrinsics let Predicates = [HasAVX, NoVLX] in { diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index a0a6aeee46b..be0c69113a2 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -343,13 +343,23 @@ def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> { } // Conversion between integer and float. -defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer. -defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float. +defm : BWWriteResPair<WriteCvtSS2I, [BWPort1], 3>; +defm : BWWriteResPair<WriteCvtPS2I, [BWPort1], 3>; +defm : BWWriteResPair<WriteCvtPS2IY, [BWPort1], 3>; +defm : BWWriteResPair<WriteCvtSD2I, [BWPort1], 3>; +defm : BWWriteResPair<WriteCvtPD2I, [BWPort1], 3>; +defm : BWWriteResPair<WriteCvtPD2IY, [BWPort1], 3>; + +defm : BWWriteResPair<WriteCvtI2SS, [BWPort1], 4>; +defm : BWWriteResPair<WriteCvtI2PS, [BWPort1], 4>; +defm : BWWriteResPair<WriteCvtI2PSY, [BWPort1], 4>; +defm : BWWriteResPair<WriteCvtI2SD, [BWPort1], 4>; +defm : BWWriteResPair<WriteCvtI2PD, [BWPort1], 4>; +defm : BWWriteResPair<WriteCvtI2PDY, [BWPort1], 4>; defm : BWWriteResPair<WriteCvtSS2SD, [BWPort1], 3>; defm : BWWriteResPair<WriteCvtPS2PD, [BWPort1], 3>; defm : BWWriteResPair<WriteCvtPS2PDY, [BWPort1], 3>; - defm : BWWriteResPair<WriteCvtSD2SS, [BWPort1], 3>; defm : BWWriteResPair<WriteCvtPD2PS, [BWPort1], 3>; defm : BWWriteResPair<WriteCvtPD2PSY, [BWPort1], 3>; diff --git a/llvm/lib/Target/X86/X86SchedHaswell.td b/llvm/lib/Target/X86/X86SchedHaswell.td index d7db1d951ad..7bb7331c144 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -249,13 +249,23 @@ defm : HWWriteResPair<WriteFVarBlend, [HWPort5], 2, [2], 2, 6>; defm : HWWriteResPair<WriteFVarBlendY, [HWPort5], 2, [2], 2, 7>; // Conversion between integer and float. -defm : HWWriteResPair<WriteCvtF2I, [HWPort1], 3>; -defm : HWWriteResPair<WriteCvtI2F, [HWPort1], 4>; +defm : HWWriteResPair<WriteCvtSD2I, [HWPort1], 3>; +defm : HWWriteResPair<WriteCvtPD2I, [HWPort1], 3>; +defm : HWWriteResPair<WriteCvtPD2IY, [HWPort1], 3>; +defm : HWWriteResPair<WriteCvtSS2I, [HWPort1], 3>; +defm : HWWriteResPair<WriteCvtPS2I, [HWPort1], 3>; +defm : HWWriteResPair<WriteCvtPS2IY, [HWPort1], 3>; + +defm : HWWriteResPair<WriteCvtI2SD, [HWPort1], 4>; +defm : HWWriteResPair<WriteCvtI2PD, [HWPort1], 4>; +defm : HWWriteResPair<WriteCvtI2PDY, [HWPort1], 4>; +defm : HWWriteResPair<WriteCvtI2SS, [HWPort1], 4>; +defm : HWWriteResPair<WriteCvtI2PS, [HWPort1], 4>; +defm : HWWriteResPair<WriteCvtI2PSY, [HWPort1], 4>; defm : HWWriteResPair<WriteCvtSS2SD, [HWPort1], 3>; defm : HWWriteResPair<WriteCvtPS2PD, [HWPort1], 3>; defm : HWWriteResPair<WriteCvtPS2PDY, [HWPort1], 3>; - defm : HWWriteResPair<WriteCvtSD2SS, [HWPort1], 3>; defm : HWWriteResPair<WriteCvtPD2PS, [HWPort1], 3>; defm : HWWriteResPair<WriteCvtPD2PSY, [HWPort1], 3>; diff --git a/llvm/lib/Target/X86/X86SchedSandyBridge.td b/llvm/lib/Target/X86/X86SchedSandyBridge.td index 21ab68eae13..bad755a9778 100644 --- a/llvm/lib/Target/X86/X86SchedSandyBridge.td +++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td @@ -234,13 +234,23 @@ defm : SBWriteResPair<WriteFVarBlend, [SBPort05], 2, [2], 2, 6>; defm : SBWriteResPair<WriteFVarBlendY,[SBPort05], 2, [2], 2, 7>; // Conversion between integer and float. -defm : SBWriteResPair<WriteCvtF2I, [SBPort1], 3>; -defm : SBWriteResPair<WriteCvtI2F, [SBPort1], 4>; +defm : SBWriteResPair<WriteCvtSS2I, [SBPort1], 3>; +defm : SBWriteResPair<WriteCvtPS2I, [SBPort1], 3>; +defm : SBWriteResPair<WriteCvtPS2IY, [SBPort1], 3>; +defm : SBWriteResPair<WriteCvtSD2I, [SBPort1], 3>; +defm : SBWriteResPair<WriteCvtPD2I, [SBPort1], 3>; +defm : SBWriteResPair<WriteCvtPD2IY, [SBPort1], 3>; + +defm : SBWriteResPair<WriteCvtI2SS, [SBPort1], 4>; +defm : SBWriteResPair<WriteCvtI2PS, [SBPort1], 4>; +defm : SBWriteResPair<WriteCvtI2PSY, [SBPort1], 4>; +defm : SBWriteResPair<WriteCvtI2SD, [SBPort1], 4>; +defm : SBWriteResPair<WriteCvtI2PD, [SBPort1], 4>; +defm : SBWriteResPair<WriteCvtI2PDY, [SBPort1], 4>; defm : SBWriteResPair<WriteCvtSS2SD, [SBPort0], 1, [1], 1, 6>; defm : SBWriteResPair<WriteCvtPS2PD, [SBPort0,SBPort5], 2, [1,1], 2>; defm : SBWriteResPair<WriteCvtPS2PDY, [SBPort0,SBPort5], 2, [1,1], 2>; - defm : SBWriteResPair<WriteCvtSD2SS, [SBPort1,SBPort5], 4, [1,1], 2, 6>; defm : SBWriteResPair<WriteCvtPD2PS, [SBPort1,SBPort5], 4, [1,1], 2, 6>; defm : SBWriteResPair<WriteCvtPD2PSY, [SBPort1,SBPort5], 4, [1,1], 2, 7>; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeClient.td b/llvm/lib/Target/X86/X86SchedSkylakeClient.td index 6169fe61f98..bb497e0fc66 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -336,13 +336,23 @@ def : WriteRes<WriteVecExtractSt, [SKLPort4,SKLPort5,SKLPort237]> { } // Conversion between integer and float. -defm : SKLWriteResPair<WriteCvtF2I, [SKLPort1], 3>; // Float -> Integer. -defm : SKLWriteResPair<WriteCvtI2F, [SKLPort1], 4>; // Integer -> Float. +defm : SKLWriteResPair<WriteCvtSS2I, [SKLPort1], 3>; +defm : SKLWriteResPair<WriteCvtPS2I, [SKLPort1], 3>; +defm : SKLWriteResPair<WriteCvtPS2IY, [SKLPort1], 3>; +defm : SKLWriteResPair<WriteCvtSD2I, [SKLPort1], 3>; +defm : SKLWriteResPair<WriteCvtPD2I, [SKLPort1], 3>; +defm : SKLWriteResPair<WriteCvtPD2IY, [SKLPort1], 3>; + +defm : SKLWriteResPair<WriteCvtI2SS, [SKLPort1], 4>; +defm : SKLWriteResPair<WriteCvtI2PS, [SKLPort1], 4>; +defm : SKLWriteResPair<WriteCvtI2PSY, [SKLPort1], 4>; +defm : SKLWriteResPair<WriteCvtI2SD, [SKLPort1], 4>; +defm : SKLWriteResPair<WriteCvtI2PD, [SKLPort1], 4>; +defm : SKLWriteResPair<WriteCvtI2PDY, [SKLPort1], 4>; defm : SKLWriteResPair<WriteCvtSS2SD, [SKLPort1], 3>; defm : SKLWriteResPair<WriteCvtPS2PD, [SKLPort1], 3>; defm : SKLWriteResPair<WriteCvtPS2PDY, [SKLPort1], 3>; - defm : SKLWriteResPair<WriteCvtSD2SS, [SKLPort1], 3>; defm : SKLWriteResPair<WriteCvtPD2PS, [SKLPort1], 3>; defm : SKLWriteResPair<WriteCvtPD2PSY, [SKLPort1], 3>; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index 749aff16ebf..ae9f64b0383 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -336,13 +336,23 @@ def : WriteRes<WriteVecExtractSt, [SKXPort4,SKXPort5,SKXPort237]> { } // Conversion between integer and float. -defm : SKXWriteResPair<WriteCvtF2I, [SKXPort1], 3>; -defm : SKXWriteResPair<WriteCvtI2F, [SKXPort1], 4>; +defm : SKXWriteResPair<WriteCvtSS2I, [SKXPort0,SKXPort015], 6, [1,1], 2>; +defm : SKXWriteResPair<WriteCvtPS2I, [SKXPort1], 3>; +defm : SKXWriteResPair<WriteCvtPS2IY, [SKXPort1], 3>; +defm : SKXWriteResPair<WriteCvtSD2I, [SKXPort0,SKXPort015], 6, [1,1], 2>; +defm : SKXWriteResPair<WriteCvtPD2I, [SKXPort1], 3>; +defm : SKXWriteResPair<WriteCvtPD2IY, [SKXPort1], 3>; + +defm : SKXWriteResPair<WriteCvtI2SS, [SKXPort1], 4>; +defm : SKXWriteResPair<WriteCvtI2PS, [SKXPort1], 4>; +defm : SKXWriteResPair<WriteCvtI2PSY, [SKXPort1], 4>; +defm : SKXWriteResPair<WriteCvtI2SD, [SKXPort1], 4>; +defm : SKXWriteResPair<WriteCvtI2PD, [SKXPort0,SKXPort5], 5, [1,1], 2>; +defm : SKXWriteResPair<WriteCvtI2PDY, [SKXPort1], 4>; defm : SKXWriteResPair<WriteCvtSS2SD, [SKXPort1], 3>; defm : SKXWriteResPair<WriteCvtPS2PD, [SKXPort1], 3>; defm : SKXWriteResPair<WriteCvtPS2PDY, [SKXPort1], 3>; - defm : SKXWriteResPair<WriteCvtSD2SS, [SKXPort1], 3>; defm : SKXWriteResPair<WriteCvtPD2PS, [SKXPort1], 3>; defm : SKXWriteResPair<WriteCvtPD2PSY, [SKXPort1], 3>; @@ -1040,14 +1050,6 @@ def SKXWriteResGroup59 : SchedWriteRes<[SKXPort015]> { } def: InstRW<[SKXWriteResGroup59], (instregex "VCVTSD2SSZrr")>; -def SKXWriteResGroup60 : SchedWriteRes<[SKXPort0,SKXPort5]> { - let Latency = 5; - let NumMicroOps = 2; - let ResourceCycles = [1,1]; -} -def: InstRW<[SKXWriteResGroup60], (instregex "(V?)CVTDQ2PDrr", - "MMX_CVTPI2PDirr")>; - def SKXWriteResGroup61 : SchedWriteRes<[SKXPort5,SKXPort015]> { let Latency = 5; let NumMicroOps = 2; @@ -1205,26 +1207,6 @@ def: InstRW<[SKXWriteResGroup73], (instregex "MMX_PADDSBirm", "MMX_PSUBUSBirm", "MMX_PSUBUSWirm")>; -def SKXWriteResGroup74 : SchedWriteRes<[SKXPort0,SKXPort015]> { - let Latency = 6; - let NumMicroOps = 2; - let ResourceCycles = [1,1]; -} -def: InstRW<[SKXWriteResGroup74], (instregex "CVTSD2SI(64)?rr", - "CVTSS2SI(64)?rr", - "CVTTSD2SI(64)?rr", - "VCVTSD2SI(64)?Zrr", - "VCVTSD2SI(64)?rr", - "VCVTSD2USI(64)?Zrr", - "VCVTSS2SI(64)?Zrr", - "VCVTSS2SI(64)?rr", - "VCVTSS2USIZrr", - "VCVTTSD2SI(64)?Zrr(b?)", - "VCVTTSD2SI(64)?rr", - "VCVTTSD2USI64Zrr(b?)", - "VCVTTSD2USIZrr(b?)", - "VCVTTSS2USIZrr(b?)")>; - def SKXWriteResGroup76 : SchedWriteRes<[SKXPort6,SKXPort23]> { let Latency = 6; let NumMicroOps = 2; @@ -1935,13 +1917,6 @@ def: InstRW<[SKXWriteResGroup151], (instregex "VEXPANDPDZ128rm(b?)", "VPEXPANDDZ128rm(b?)", "VPEXPANDQZ128rm(b?)")>; -def SKXWriteResGroup152 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> { - let Latency = 10; - let NumMicroOps = 3; - let ResourceCycles = [1,1,1]; -} -def: InstRW<[SKXWriteResGroup152], (instregex "MMX_CVTPI2PDirm")>; - def SKXWriteResGroup153 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> { let Latency = 10; let NumMicroOps = 3; @@ -2035,39 +2010,6 @@ def SKXWriteResGroup164 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> { } def: InstRW<[SKXWriteResGroup164], (instregex "(V?)CVTDQ2PDrm")>; -def SKXWriteResGroup165 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015]> { - let Latency = 11; - let NumMicroOps = 3; - let ResourceCycles = [1,1,1]; -} -def: InstRW<[SKXWriteResGroup165], (instregex "CVTSD2SI64rm", - "CVTSD2SIrm", - "CVTSS2SI64rm", - "CVTSS2SIrm", - "CVTTSD2SI64rm", - "CVTTSD2SIrm", - "CVTTSS2SIrm", - "VCVTSD2SI64Zrm(b?)", - "VCVTSD2SI64rm", - "VCVTSD2SIZrm(b?)", - "VCVTSD2SIrm", - "VCVTSD2USI64Zrm(b?)", - "VCVTSS2SI64Zrm(b?)", - "VCVTSS2SI64rm", - "VCVTSS2SIZrm(b?)", - "VCVTSS2SIrm", - "VCVTSS2USIZrm(b?)", - "VCVTTSD2SI64Zrm(b?)", - "VCVTTSD2SI64rm", - "VCVTTSD2SIZrm(b?)", - "VCVTTSD2SIrm", - "VCVTTSD2USI64Zrm(b?)", - "VCVTTSS2SI64Zrm(b?)", - "VCVTTSS2SI64rm", - "VCVTTSS2SIZrm(b?)", - "VCVTTSS2SIrm", - "VCVTTSS2USIZrm(b?)")>; - def SKXWriteResGroup166 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> { let Latency = 11; let NumMicroOps = 3; diff --git a/llvm/lib/Target/X86/X86Schedule.td b/llvm/lib/Target/X86/X86Schedule.td index 2b190fdf40a..75838cf6f92 100644 --- a/llvm/lib/Target/X86/X86Schedule.td +++ b/llvm/lib/Target/X86/X86Schedule.td @@ -296,8 +296,21 @@ def WriteVecMOVMSKY : SchedWrite; def WriteMMXMOVMSK : SchedWrite; // Conversion between integer and float. -defm WriteCvtF2I : X86SchedWritePair; // Float -> Integer. -defm WriteCvtI2F : X86SchedWritePair; // Integer -> Float. +defm WriteCvtSD2I : X86SchedWritePair; // Double -> Integer. +defm WriteCvtPD2I : X86SchedWritePair; // Double -> Integer (XMM). +defm WriteCvtPD2IY : X86SchedWritePair; // Double -> Integer (YMM/ZMM). + +defm WriteCvtSS2I : X86SchedWritePair; // Float -> Integer. +defm WriteCvtPS2I : X86SchedWritePair; // Float -> Integer (XMM). +defm WriteCvtPS2IY : X86SchedWritePair; // Float -> Integer (YMM/ZMM). + +defm WriteCvtI2SD : X86SchedWritePair; // Integer -> Double. +defm WriteCvtI2PD : X86SchedWritePair; // Integer -> Double (XMM). +defm WriteCvtI2PDY : X86SchedWritePair; // Integer -> Double (YMM/ZMM). + +defm WriteCvtI2SS : X86SchedWritePair; // Integer -> Float. +defm WriteCvtI2PS : X86SchedWritePair; // Integer -> Float (XMM). +defm WriteCvtI2PSY : X86SchedWritePair; // Integer -> Float (YMM/ZMM). defm WriteCvtSS2SD : X86SchedWritePair; // Float -> Double size conversion. defm WriteCvtPS2PD : X86SchedWritePair; // Float -> Double size conversion (XMM). @@ -458,6 +471,18 @@ def SchedWriteFVarBlend : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend, WriteFVarBlendY, WriteFVarBlendY>; +def SchedWriteCvtDQ2PD + : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD, + WriteCvtI2PDY, WriteCvtI2PDY>; +def SchedWriteCvtDQ2PS + : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS, + WriteCvtI2PSY, WriteCvtI2PSY>; +def SchedWriteCvtPD2DQ + : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I, + WriteCvtPD2IY, WriteCvtPD2IY>; +def SchedWriteCvtPS2DQ + : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I, + WriteCvtPS2IY, WriteCvtPS2IY>; def SchedWriteCvtPS2PD : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD, WriteCvtPS2PDY, WriteCvtPS2PDY>; diff --git a/llvm/lib/Target/X86/X86ScheduleAtom.td b/llvm/lib/Target/X86/X86ScheduleAtom.td index 35086c48f3e..57366b76074 100644 --- a/llvm/lib/Target/X86/X86ScheduleAtom.td +++ b/llvm/lib/Target/X86/X86ScheduleAtom.td @@ -273,13 +273,23 @@ defm : AtomWriteResPair<WriteFVarShuffle256, [AtomPort0], [AtomPort0]>; // NOTE // Conversions. //////////////////////////////////////////////////////////////////////////////// -defm : AtomWriteResPair<WriteCvtF2I, [AtomPort01], [AtomPort01], 8, 9, [8], [9]>; -defm : AtomWriteResPair<WriteCvtI2F, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; +defm : AtomWriteResPair<WriteCvtSS2I, [AtomPort01], [AtomPort01], 8, 9, [8], [9]>; +defm : AtomWriteResPair<WriteCvtPS2I, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; +defm : AtomWriteResPair<WriteCvtPS2IY, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; +defm : AtomWriteResPair<WriteCvtSD2I, [AtomPort01], [AtomPort01], 8, 9, [8], [9]>; +defm : AtomWriteResPair<WriteCvtPD2I, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; +defm : AtomWriteResPair<WriteCvtPD2IY, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; + +defm : AtomWriteResPair<WriteCvtI2SS, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; +defm : AtomWriteResPair<WriteCvtI2PS, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; +defm : AtomWriteResPair<WriteCvtI2PSY, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; +defm : AtomWriteResPair<WriteCvtI2SD, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; +defm : AtomWriteResPair<WriteCvtI2PD, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; +defm : AtomWriteResPair<WriteCvtI2PDY, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; defm : AtomWriteResPair<WriteCvtSS2SD, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; defm : AtomWriteResPair<WriteCvtPS2PD, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; defm : AtomWriteResPair<WriteCvtPS2PDY, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; - defm : AtomWriteResPair<WriteCvtSD2SS, [AtomPort01], [AtomPort01], 6, 7, [6], [7]>; defm : AtomWriteResPair<WriteCvtPD2PS, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; defm : AtomWriteResPair<WriteCvtPD2PSY, [AtomPort01], [AtomPort01], 7, 8, [7], [8]>; @@ -565,8 +575,7 @@ def : InstRW<[AtomWrite01_6], (instrs LD_F1, CMPXCHG8rm, INTO, XLAT, SHLD16rrCL, SHRD16rrCL, SHLD16rri8, SHRD16rri8, SHLD16mrCL, SHRD16mrCL, - SHLD16mri8, SHRD16mri8, - CVTPS2DQrr, CVTTPS2DQrr)>; + SHLD16mri8, SHRD16mri8)>; def : InstRW<[AtomWrite01_6], (instregex "IMUL16rr", "IST_F(P)?(16|32|64)?m", "MMX_PH(ADD|SUB)S?Wrm")>; @@ -575,15 +584,7 @@ def AtomWrite01_7 : SchedWriteRes<[AtomPort01]> { let Latency = 7; let ResourceCycles = [7]; } -def : InstRW<[AtomWrite01_7], (instrs AAD8i8, - CVTDQ2PDrr, - CVTPD2DQrr, - CVTPS2DQrm, - CVTTPD2DQrr, - CVTTPS2DQrm, - MMX_CVTPD2PIirr, - MMX_CVTPI2PDirr, - MMX_CVTTPD2PIirr)>; +def : InstRW<[AtomWrite01_7], (instrs AAD8i8)>; def AtomWrite01_8 : SchedWriteRes<[AtomPort01]> { let Latency = 8; @@ -592,13 +593,7 @@ def AtomWrite01_8 : SchedWriteRes<[AtomPort01]> { def : InstRW<[AtomWrite01_8], (instrs LOOPE, PUSHA16, PUSHA32, SHLD64rrCL, SHRD64rrCL, - FNSTCW16m, - CVTDQ2PDrm, - CVTPD2DQrm, - CVTTPD2DQrm, - MMX_CVTPD2PIirm, - MMX_CVTPI2PDirm, - MMX_CVTTPD2PIirm)>; + FNSTCW16m)>; def AtomWrite01_9 : SchedWriteRes<[AtomPort01]> { let Latency = 9; diff --git a/llvm/lib/Target/X86/X86ScheduleBtVer2.td b/llvm/lib/Target/X86/X86ScheduleBtVer2.td index c3b60d71093..60e13d595e6 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -360,8 +360,20 @@ defm : JWriteResFpuPair<WriteFVarShuffle256, [JFPU01, JFPX], 1>; // NOTE: Doesn // Conversions. //////////////////////////////////////////////////////////////////////////////// -defm : JWriteResFpuPair<WriteCvtF2I, [JFPU1, JSTC], 3>; -defm : JWriteResFpuPair<WriteCvtI2F, [JFPU1, JSTC], 3>; +defm : JWriteResFpuPair<WriteCvtSS2I, [JFPU1, JSTC, JFPA, JALU0], 7, [1,1], 2>; +defm : JWriteResFpuPair<WriteCvtPS2I, [JFPU1, JSTC], 3, [1,1], 1>; +defm : JWriteResYMMPair<WriteCvtPS2IY, [JFPU1, JSTC], 3, [2,2], 2>; +defm : JWriteResFpuPair<WriteCvtSD2I, [JFPU1, JSTC, JFPA, JALU0], 7, [1,1], 2>; +defm : JWriteResFpuPair<WriteCvtPD2I, [JFPU1, JSTC], 3, [1,1], 1>; +defm : JWriteResYMMPair<WriteCvtPD2IY, [JFPU1, JSTC, JFPX], 6, [2,2,4], 3>; + +// FIXME: f+3 ST, LD+STC latency +defm : JWriteResFpuPair<WriteCvtI2SS, [JFPU1, JSTC], 9, [1,1], 2>; +defm : JWriteResFpuPair<WriteCvtI2PS, [JFPU1, JSTC], 3, [1,1], 1>; +defm : JWriteResYMMPair<WriteCvtI2PSY, [JFPU1, JSTC], 3, [2,2], 2>; +defm : JWriteResFpuPair<WriteCvtI2SD, [JFPU1, JSTC], 9, [1,1], 2>; +defm : JWriteResFpuPair<WriteCvtI2PD, [JFPU1, JSTC], 3, [1,1], 1>; +defm : JWriteResYMMPair<WriteCvtI2PDY, [JFPU1, JSTC], 3, [2,2], 2>; defm : JWriteResFpuPair<WriteCvtSS2SD, [JFPU1, JSTC], 7, [1,2], 2>; defm : JWriteResFpuPair<WriteCvtPS2PD, [JFPU1, JSTC], 2, [1,1], 1>; @@ -379,31 +391,6 @@ defm : X86WriteRes<WriteCvtPS2PHY, [JFPU1, JSTC, JFPX], 6, [2,2,2], 3>; defm : X86WriteRes<WriteCvtPS2PHSt, [JFPU1, JSTC, JSAGU], 4, [1,1,1], 1>; defm : X86WriteRes<WriteCvtPS2PHYSt, [JFPU1, JSTC, JFPX, JSAGU], 7, [2,2,2,1], 3>; -def JWriteCVTF2SI : SchedWriteRes<[JFPU1, JSTC, JFPA, JALU0]> { - let Latency = 7; - let NumMicroOps = 2; -} -def : InstRW<[JWriteCVTF2SI], (instregex "(V)?CVT(T?)S(D|S)2SI(64)?rr")>; - -def JWriteCVTF2SILd : SchedWriteRes<[JLAGU, JFPU1, JSTC, JFPA, JALU0]> { - let Latency = 12; - let NumMicroOps = 2; -} -def : InstRW<[JWriteCVTF2SILd], (instregex "(V)?CVT(T?)S(D|S)2SI(64)?rm")>; - -// FIXME: f+3 ST, LD+STC latency -def JWriteCVTSI2F : SchedWriteRes<[JFPU1, JSTC]> { - let Latency = 9; - let NumMicroOps = 2; -} -def : InstRW<[JWriteCVTSI2F], (instregex "(V)?CVTSI(64)?2S(D|S)rr")>; - -def JWriteCVTSI2FLd : SchedWriteRes<[JLAGU, JFPU1, JSTC]> { - let Latency = 14; - let NumMicroOps = 2; -} -def : InstRW<[JWriteCVTSI2FLd], (instregex "(V)?CVTSI(64)?2S(D|S)rm")>; - //////////////////////////////////////////////////////////////////////////////// // Vector integer operations. //////////////////////////////////////////////////////////////////////////////// @@ -532,36 +519,6 @@ def : InstRW<[JWriteINSERTQ], (instrs INSERTQ, INSERTQI)>; // AVX instructions. //////////////////////////////////////////////////////////////////////////////// -def JWriteVCVTY: SchedWriteRes<[JFPU1, JSTC]> { - let Latency = 3; - let ResourceCycles = [2, 2]; - let NumMicroOps = 2; -} -def : InstRW<[JWriteVCVTY], (instrs VCVTDQ2PDYrr, VCVTDQ2PSYrr, - VCVTPS2DQYrr, VCVTTPS2DQYrr)>; - -def JWriteVCVTYLd: SchedWriteRes<[JLAGU, JFPU1, JSTC]> { - let Latency = 8; - let ResourceCycles = [2, 2, 2]; - let NumMicroOps = 2; -} -def : InstRW<[JWriteVCVTYLd, ReadAfterLd], (instrs VCVTDQ2PDYrm, VCVTDQ2PSYrm, - VCVTPS2DQYrm, VCVTTPS2DQYrm)>; - -def JWriteVCVTPDY: SchedWriteRes<[JFPU1, JSTC, JFPX]> { - let Latency = 6; - let ResourceCycles = [2, 2, 4]; - let NumMicroOps = 3; -} -def : InstRW<[JWriteVCVTPDY], (instrs VCVTPD2DQYrr, VCVTTPD2DQYrr)>; - -def JWriteVCVTPDYLd: SchedWriteRes<[JLAGU, JFPU1, JSTC, JFPX]> { - let Latency = 11; - let ResourceCycles = [2, 2, 2, 4]; - let NumMicroOps = 3; -} -def : InstRW<[JWriteVCVTPDYLd, ReadAfterLd], (instrs VCVTPD2DQYrm, VCVTTPD2DQYrm)>; - def JWriteVBROADCASTYLd: SchedWriteRes<[JLAGU, JFPU01, JFPX]> { let Latency = 6; let ResourceCycles = [1, 2, 4]; diff --git a/llvm/lib/Target/X86/X86ScheduleSLM.td b/llvm/lib/Target/X86/X86ScheduleSLM.td index 35f1318dddf..99ca235bdb8 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -211,13 +211,23 @@ defm : SLMWriteResPair<WriteFVarShuffleY,[SLM_FPC_RSV0], 1>; defm : SLMWriteResPair<WriteFBlend, [SLM_FPC_RSV0], 1>; // Conversion between integer and float. -defm : SLMWriteResPair<WriteCvtF2I, [SLM_FPC_RSV01], 4>; -defm : SLMWriteResPair<WriteCvtI2F, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtSS2I, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtPS2I, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtPS2IY, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtSD2I, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtPD2I, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtPD2IY, [SLM_FPC_RSV01], 4>; + +defm : SLMWriteResPair<WriteCvtI2SS, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtI2PS, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtI2PSY, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtI2SD, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtI2PD, [SLM_FPC_RSV01], 4>; +defm : SLMWriteResPair<WriteCvtI2PDY, [SLM_FPC_RSV01], 4>; defm : SLMWriteResPair<WriteCvtSS2SD, [SLM_FPC_RSV01], 4>; defm : SLMWriteResPair<WriteCvtPS2PD, [SLM_FPC_RSV01], 4>; defm : SLMWriteResPair<WriteCvtPS2PDY, [SLM_FPC_RSV01], 4>; - defm : SLMWriteResPair<WriteCvtSD2SS, [SLM_FPC_RSV01], 4>; defm : SLMWriteResPair<WriteCvtPD2PS, [SLM_FPC_RSV01], 4>; defm : SLMWriteResPair<WriteCvtPD2PSY, [SLM_FPC_RSV01], 4>; diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td index 1b87920e03f..60862a005f7 100644 --- a/llvm/lib/Target/X86/X86ScheduleZnver1.td +++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td @@ -226,8 +226,18 @@ defm : ZnWriteResFpuPair<WriteFVarBlend, [ZnFPU01], 1>; defm : ZnWriteResFpuPair<WriteFVarBlendY,[ZnFPU01], 1>; defm : ZnWriteResFpuPair<WriteVarBlend, [ZnFPU0], 1>; defm : ZnWriteResFpuPair<WriteVarBlendY, [ZnFPU0], 1>; -defm : ZnWriteResFpuPair<WriteCvtI2F, [ZnFPU3], 5>; -defm : ZnWriteResFpuPair<WriteCvtF2I, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtSS2I, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtPS2I, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtPS2IY, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtSD2I, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtPD2I, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtPD2IY, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtI2SS, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtI2PS, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtI2PSY, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtI2SD, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtI2PD, [ZnFPU3], 5>; +defm : ZnWriteResFpuPair<WriteCvtI2PDY, [ZnFPU3], 5>; defm : ZnWriteResFpuPair<WriteFDiv, [ZnFPU3], 15>; defm : ZnWriteResFpuPair<WriteFDivX, [ZnFPU3], 15>; //defm : ZnWriteResFpuPair<WriteFDivY, [ZnFPU3], 15>; |