mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[X86] Split WriteCvtI2F/WriteCvtF2I into I<->F32 and I<->F64 scheduler classes
A lot of the models still have too many InstRW overrides for these new classes - this needs cleaning up but I wanted to get the classes in first llvm-svn: 332451
This commit is contained in:
parent
9e75510744
commit
d39d2a9256
@ -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">;
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
|
@ -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 {
|
||||
|
@ -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>;
|
||||
|
@ -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>;
|
||||
|
@ -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>;
|
||||
|
@ -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>;
|
||||
|
@ -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;
|
||||
|
@ -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>;
|
||||
|
@ -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;
|
||||
|
@ -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];
|
||||
|
@ -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>;
|
||||
|
@ -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>;
|
||||
|
Loading…
x
Reference in New Issue
Block a user