Index: lib/Target/X86/X86InstrAVX512.td =================================================================== --- lib/Target/X86/X86InstrAVX512.td +++ lib/Target/X86/X86InstrAVX512.td @@ -8014,8 +8014,8 @@ let Predicates = [HasAVX512] in defm VCVTPH2PSZ : avx512_cvtph2ps, - avx512_cvtph2ps_sae, + WriteCvtPH2PSZ>, + avx512_cvtph2ps_sae, EVEX, EVEX_V512, EVEX_CD8<32, CD8VH>; let Predicates = [HasVLX] in { @@ -8068,8 +8068,8 @@ let Predicates = [HasAVX512] in { defm VCVTPS2PHZ : avx512_cvtps2ph, - avx512_cvtps2ph_sae, + WriteCvtPS2PHZ, WriteCvtPS2PHZSt>, + avx512_cvtps2ph_sae, EVEX, EVEX_V512, EVEX_CD8<32, CD8VH>; let Predicates = [HasVLX] in { defm VCVTPS2PHZ256 : avx512_cvtps2ph; // Floating point add/sub. defm : BWWriteResPair; // Floating point add/sub (XMM). defm : BWWriteResPair; // Floating point add/sub (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point double add/sub. defm : BWWriteResPair; // Floating point double add/sub (XMM). defm : BWWriteResPair; // Floating point double add/sub (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point compare. defm : BWWriteResPair; // Floating point compare (XMM). defm : BWWriteResPair; // Floating point compare (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point double compare. defm : BWWriteResPair; // Floating point double compare (XMM). defm : BWWriteResPair; // Floating point double compare (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point compare to flags. defm : BWWriteResPair; // Floating point multiplication. defm : BWWriteResPair; // Floating point multiplication (XMM). defm : BWWriteResPair; // Floating point multiplication (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point double multiplication. defm : BWWriteResPair; // Floating point double multiplication (XMM). defm : BWWriteResPair; // Floating point double multiplication (YMM/ZMM). +defm : X86WriteResPairUnsupported; //defm : BWWriteResPair; // Floating point division. defm : BWWriteResPair; // Floating point division (XMM). @@ -233,34 +239,45 @@ defm : BWWriteResPair; // Floating point reciprocal estimate. defm : BWWriteResPair; // Floating point reciprocal estimate (XMM). defm : BWWriteResPair; // Floating point reciprocal estimate (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point reciprocal square root estimate. defm : BWWriteResPair; // Floating point reciprocal square root estimate (XMM). defm : BWWriteResPair; // Floating point reciprocal square root estimate (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Fused Multiply Add. defm : BWWriteResPair; // Fused Multiply Add (XMM). defm : BWWriteResPair; // Fused Multiply Add (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point double dot product. defm : BWWriteResPair; // Floating point single dot product. defm : BWWriteResPair; // Floating point single dot product (YMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point fabs/fchs. defm : X86WriteRes; // Floating point rounding. defm : X86WriteRes; // Floating point rounding (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : X86WriteRes; defm : X86WriteRes; defm : BWWriteResPair; // Floating point and/or/xor logicals. defm : BWWriteResPair; // Floating point and/or/xor logicals (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point TEST instructions. defm : BWWriteResPair; // Floating point TEST instructions (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point vector shuffles. defm : BWWriteResPair; // Floating point vector shuffles (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point vector variable shuffles. defm : BWWriteResPair; // Floating point vector variable shuffles. +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Floating point vector blends. defm : BWWriteResPair; // Floating point vector blends. +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Fp vector variable blends. defm : BWWriteResPair; // Fp vector variable blends. +defm : X86WriteResPairUnsupported; // FMA Scheduling helper class. // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; } @@ -291,31 +308,42 @@ defm : BWWriteResPair; // Vector integer ALU op, no logicals. defm : BWWriteResPair; // Vector integer ALU op, no logicals. defm : BWWriteResPair; // Vector integer ALU op, no logicals (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector integer and/or/xor. defm : BWWriteResPair; // Vector integer and/or/xor. defm : BWWriteResPair; // Vector integer and/or/xor (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector integer TEST instructions. defm : BWWriteResPair; // Vector integer TEST instructions (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector integer multiply. defm : BWWriteResPair; // Vector integer multiply. defm : BWWriteResPair; // Vector integer multiply. +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector PMULLD. defm : BWWriteResPair; // Vector PMULLD (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector shuffles. defm : BWWriteResPair; // Vector shuffles. defm : BWWriteResPair; // Vector shuffles (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector variable shuffles. defm : BWWriteResPair; // Vector variable shuffles. defm : BWWriteResPair; // Vector variable shuffles (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector blends. defm : BWWriteResPair; // Vector blends (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector variable blends. defm : BWWriteResPair; // Vector variable blends (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector MPSAD. defm : BWWriteResPair; // Vector MPSAD. +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector PSADBW. defm : BWWriteResPair; // Vector PSADBW. defm : BWWriteResPair; // Vector PSADBW (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Vector PHMINPOS. // Vector integer shifts. @@ -323,12 +351,15 @@ defm : BWWriteResPair; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; defm : BWWriteResPair; // Vector integer immediate shifts (XMM). defm : BWWriteResPair; // Vector integer immediate shifts (YMM/ZMM). +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; // Variable vector shifts. defm : BWWriteResPair; // Variable vector shifts (YMM/ZMM). +defm : X86WriteResPairUnsupported; // Vector insert/extract operations. def : WriteRes { @@ -354,33 +385,43 @@ defm : BWWriteResPair; defm : BWWriteResPair; defm : BWWriteResPair; +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; defm : BWWriteResPair; defm : BWWriteResPair; +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; defm : BWWriteResPair; defm : BWWriteResPair; +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; defm : BWWriteResPair; defm : BWWriteResPair; +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; defm : BWWriteResPair; defm : BWWriteResPair; +defm : X86WriteResPairUnsupported; defm : BWWriteResPair; defm : BWWriteResPair; defm : BWWriteResPair; +defm : X86WriteResPairUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; // Strings instructions. Index: lib/Target/X86/X86SchedHaswell.td =================================================================== --- lib/Target/X86/X86SchedHaswell.td +++ lib/Target/X86/X86SchedHaswell.td @@ -185,25 +185,31 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; @@ -217,10 +223,12 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; @@ -235,60 +243,80 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 // Conversion between integer and float. defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 // Vector integer operations. defm : X86WriteRes; @@ -314,46 +342,61 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; // Vector integer shifts. defm : HWWriteResPair; defm : HWWriteResPair; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 defm : HWWriteResPair; defm : HWWriteResPair; +defm : HWWriteResPair; // Unsupported = 1 // Vector insert/extract operations. def : WriteRes { Index: lib/Target/X86/X86SchedSandyBridge.td =================================================================== --- lib/Target/X86/X86SchedSandyBridge.td +++ lib/Target/X86/X86SchedSandyBridge.td @@ -176,25 +176,31 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; @@ -208,10 +214,12 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; @@ -226,58 +234,78 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 // Conversion between integer and float. defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : SBWriteResPair; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; // Unsupported = 1 // Vector integer operations. defm : X86WriteRes; @@ -303,42 +331,56 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; // TODO this is probably wrong for 256/512-bit for the "generic" model +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; // Vector integer shifts. defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 // Vector insert/extract operations. def : WriteRes { @@ -365,9 +407,11 @@ defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 //////////////////////////////////////////////////////////////////////////////// // String instructions. @@ -484,6 +528,7 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : SBWriteResPair; // Unsupported = 1 // Remaining SNB instrs. Index: lib/Target/X86/X86SchedSkylakeClient.td =================================================================== --- lib/Target/X86/X86SchedSkylakeClient.td +++ lib/Target/X86/X86SchedSkylakeClient.td @@ -183,76 +183,93 @@ defm : X86WriteRes; defm : SKLWriteResPair; // Floating point add/sub. -defm : SKLWriteResPair; // Floating point add/sub (XMM). -defm : SKLWriteResPair; // Floating point add/sub (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point double add/sub. -defm : SKLWriteResPair; // Floating point double add/sub (XMM). -defm : SKLWriteResPair; // Floating point double add/sub (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point compare. -defm : SKLWriteResPair; // Floating point compare (XMM). -defm : SKLWriteResPair; // Floating point compare (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point double compare. -defm : SKLWriteResPair; // Floating point double compare (XMM). -defm : SKLWriteResPair; // Floating point double compare (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point compare to flags. defm : SKLWriteResPair; // Floating point multiplication. -defm : SKLWriteResPair; // Floating point multiplication (XMM). -defm : SKLWriteResPair; // Floating point multiplication (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point double multiplication. -defm : SKLWriteResPair; // Floating point double multiplication (XMM). -defm : SKLWriteResPair; // Floating point double multiplication (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point division. -//defm : SKLWriteResPair; // Floating point division (XMM). -defm : SKLWriteResPair; // Floating point division (YMM). +//defm : SKLWriteResPair; +defm : SKLWriteResPair; defm : X86WriteResPairUnsupported; //defm : SKLWriteResPair; // Floating point double division. -//defm : SKLWriteResPair; // Floating point double division (XMM). -//defm : SKLWriteResPair; // Floating point double division (YMM). +//defm : SKLWriteResPair; +//defm : SKLWriteResPair; defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point square root. -defm : SKLWriteResPair; // Floating point square root (XMM). -defm : SKLWriteResPair; // Floating point square root (YMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point double square root. -defm : SKLWriteResPair; // Floating point double square root (XMM). -defm : SKLWriteResPair; // Floating point double square root (YMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point long double square root. defm : SKLWriteResPair; // Floating point reciprocal estimate. -defm : SKLWriteResPair; // Floating point reciprocal estimate (XMM). -defm : SKLWriteResPair; // Floating point reciprocal estimate (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point reciprocal square root estimate. -defm : SKLWriteResPair; // Floating point reciprocal square root estimate (XMM). -defm : SKLWriteResPair; // Floating point reciprocal square root estimate (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Fused Multiply Add. -defm : SKLWriteResPair; // Fused Multiply Add (XMM). -defm : SKLWriteResPair; // Fused Multiply Add (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point double dot product. -defm : SKLWriteResPair; // Floating point single dot product. -defm : SKLWriteResPair; // Floating point single dot product (YMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point fabs/fchs. defm : SKLWriteResPair; // Floating point rounding. -defm : SKLWriteResPair; // Floating point rounding (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point and/or/xor logicals. -defm : SKLWriteResPair; // Floating point and/or/xor logicals (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point TEST instructions. -defm : SKLWriteResPair; // Floating point TEST instructions (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point vector shuffles. -defm : SKLWriteResPair; // Floating point vector shuffles (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point vector shuffles. -defm : SKLWriteResPair; // Floating point vector shuffles. +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Floating point vector blends. -defm : SKLWriteResPair; // Floating point vector blends. +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Fp vector variable blends. -defm : SKLWriteResPair; // Fp vector variable blends. +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; // FMA Scheduling helper class. // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; } @@ -279,33 +296,44 @@ defm : X86WriteRes; defm : SKLWriteResPair; // Vector integer ALU op, no logicals. -defm : SKLWriteResPair; // Vector integer ALU op, no logicals (XMM). -defm : SKLWriteResPair; // Vector integer ALU op, no logicals (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector integer and/or/xor. -defm : SKLWriteResPair; // Vector integer and/or/xor (XMM). -defm : SKLWriteResPair; // Vector integer and/or/xor (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector integer TEST instructions. -defm : SKLWriteResPair; // Vector integer TEST instructions (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector integer multiply. -defm : SKLWriteResPair; // Vector integer multiply (XMM). -defm : SKLWriteResPair; // Vector integer multiply (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector PMULLD. -defm : SKLWriteResPair; // Vector PMULLD (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector shuffles. -defm : SKLWriteResPair; // Vector shuffles (XMM). -defm : SKLWriteResPair; // Vector shuffles (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector shuffles. -defm : SKLWriteResPair; // Vector shuffles (XMM). -defm : SKLWriteResPair; // Vector shuffles (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector blends. -defm : SKLWriteResPair; // Vector blends (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector variable blends. -defm : SKLWriteResPair; // Vector variable blends (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector MPSAD. -defm : SKLWriteResPair; // Vector MPSAD (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector PSADBW. -defm : SKLWriteResPair; // Vector PSADBW (XMM). -defm : SKLWriteResPair; // Vector PSADBW (YMM/ZMM). +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Vector PHMINPOS. // Vector integer shifts. @@ -314,12 +342,15 @@ defm : X86WriteRes; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResPairUnsupported; -defm : SKLWriteResPair; -defm : SKLWriteResPair; // Vector integer immediate shifts (XMM). -defm : SKLWriteResPair; // Vector integer immediate shifts (YMM/ZMM). +defm : SKLWriteResPair; // Vector integer immediate shifts. +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; // Variable vector shifts. -defm : SKLWriteResPair; // Variable vector shifts (YMM/ZMM). +defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; // Vector insert/extract operations. def : WriteRes { @@ -346,33 +377,43 @@ defm : SKLWriteResPair; defm : SKLWriteResPair; defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; defm : SKLWriteResPair; defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; defm : SKLWriteResPair; defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; defm : SKLWriteResPair; defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; defm : SKLWriteResPair; defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : SKLWriteResPair; defm : SKLWriteResPair; defm : SKLWriteResPair; +defm : X86WriteResPairUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; // Strings instructions. Index: lib/Target/X86/X86SchedSkylakeServer.td =================================================================== --- lib/Target/X86/X86SchedSkylakeServer.td +++ lib/Target/X86/X86SchedSkylakeServer.td @@ -182,77 +182,94 @@ defm : X86WriteRes; defm : X86WriteRes; -defm : SKXWriteResPair; // Floating point add/sub. -defm : SKXWriteResPair; // Floating point add/sub (XMM). -defm : SKXWriteResPair; // Floating point add/sub (YMM/ZMM). -defm : SKXWriteResPair; // Floating point double add/sub. -defm : SKXWriteResPair; // Floating point double add/sub (XMM). -defm : SKXWriteResPair; // Floating point double add/sub (YMM/ZMM). - -defm : SKXWriteResPair; // Floating point compare. -defm : SKXWriteResPair; // Floating point compare (XMM). -defm : SKXWriteResPair; // Floating point compare (YMM/ZMM). -defm : SKXWriteResPair; // Floating point double compare. -defm : SKXWriteResPair; // Floating point double compare (XMM). -defm : SKXWriteResPair; // Floating point double compare (YMM/ZMM). +defm : SKXWriteResPair; // Floating point add/sub. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; // Floating point double add/sub. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; + +defm : SKXWriteResPair; // Floating point compare. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; // Floating point double compare. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point compare to flags. -defm : SKXWriteResPair; // Floating point multiplication. -defm : SKXWriteResPair; // Floating point multiplication (XMM). -defm : SKXWriteResPair; // Floating point multiplication (YMM/ZMM). -defm : SKXWriteResPair; // Floating point double multiplication. -defm : SKXWriteResPair; // Floating point double multiplication (XMM). -defm : SKXWriteResPair; // Floating point double multiplication (YMM/ZMM). +defm : SKXWriteResPair; // Floating point multiplication. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; // Floating point double multiplication. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // 10-14 cycles. // Floating point division. -//defm : SKXWriteResPair; // 10-14 cycles. // Floating point division (XMM). -defm : SKXWriteResPair; // 10-14 cycles. // Floating point division (YMM). -defm : SKXWriteResPair; // 10-14 cycles. // Floating point division (ZMM). +//defm : SKXWriteResPair; // 10-14 cycles. +defm : SKXWriteResPair; // 10-14 cycles. +defm : SKXWriteResPair; // 10-14 cycles. //defm : SKXWriteResPair; // 10-14 cycles. // Floating point division. -//defm : SKXWriteResPair; // 10-14 cycles. // Floating point division (XMM). -//defm : SKXWriteResPair; // 10-14 cycles. // Floating point division (YMM). -defm : SKXWriteResPair; // 10-14 cycles. // Floating point division (ZMM). +//defm : SKXWriteResPair; // 10-14 cycles. +//defm : SKXWriteResPair; // 10-14 cycles. +defm : SKXWriteResPair; // 10-14 cycles. defm : SKXWriteResPair; // Floating point square root. -defm : SKXWriteResPair; // Floating point square root (XMM). -defm : SKXWriteResPair; // Floating point square root (YMM). -defm : SKXWriteResPair; // Floating point square root (ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point double square root. -defm : SKXWriteResPair; // Floating point double square root (XMM). -defm : SKXWriteResPair; // Floating point double square root (YMM). -defm : SKXWriteResPair; // Floating point double square root (ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point long double square root. defm : SKXWriteResPair; // Floating point reciprocal estimate. -defm : SKXWriteResPair; // Floating point reciprocal estimate (XMM). -defm : SKXWriteResPair; // Floating point reciprocal estimate (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point reciprocal square root estimate. -defm : SKXWriteResPair; // Floating point reciprocal square root estimate (XMM). -defm : SKXWriteResPair; // Floating point reciprocal square root estimate (YMM/ZMM). - -defm : SKXWriteResPair; // Fused Multiply Add. -defm : SKXWriteResPair; // Fused Multiply Add (XMM). -defm : SKXWriteResPair; // Fused Multiply Add (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; + +defm : SKXWriteResPair; // Fused Multiply Add. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point double dot product. -defm : SKXWriteResPair; // Floating point single dot product. -defm : SKXWriteResPair; // Floating point single dot product (YMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point fabs/fchs. -defm : SKXWriteResPair; // Floating point rounding. -defm : SKXWriteResPair; // Floating point rounding (YMM/ZMM). +defm : SKXWriteResPair; // Floating point rounding. +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point and/or/xor logicals. -defm : SKXWriteResPair; // Floating point and/or/xor logicals (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point TEST instructions. -defm : SKXWriteResPair; // Floating point TEST instructions (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point vector shuffles. -defm : SKXWriteResPair; // Floating point vector shuffles (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point vector variable shuffles. -defm : SKXWriteResPair; // Floating point vector variable shuffles. +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Floating point vector blends. -defm : SKXWriteResPair; // Floating point vector blends. +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Fp vector variable blends. -defm : SKXWriteResPair; // Fp vector variable blends. +defm : SKXWriteResPair; +defm : SKXWriteResPair; // FMA Scheduling helper class. // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; } @@ -279,47 +296,62 @@ defm : X86WriteRes; defm : SKXWriteResPair; // Vector integer ALU op, no logicals. -defm : SKXWriteResPair; // Vector integer ALU op, no logicals (XMM). -defm : SKXWriteResPair; // Vector integer ALU op, no logicals (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector integer and/or/xor. -defm : SKXWriteResPair; // Vector integer and/or/xor (XMM). -defm : SKXWriteResPair; // Vector integer and/or/xor (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector integer TEST instructions. -defm : SKXWriteResPair; // Vector integer TEST instructions (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector integer multiply. -defm : SKXWriteResPair; // Vector integer multiply (XMM). -defm : SKXWriteResPair; // Vector integer multiply (YMM/ZMM). -defm : SKXWriteResPair; // Vector PMULLD. -defm : SKXWriteResPair; // Vector PMULLD (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; // Vector PMULLD. +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector shuffles. -defm : SKXWriteResPair; // Vector shuffles (XMM). -defm : SKXWriteResPair; // Vector shuffles (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector variable shuffles. -defm : SKXWriteResPair; // Vector variable shuffles (XMM). -defm : SKXWriteResPair; // Vector variable shuffles (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector blends. -defm : SKXWriteResPair; // Vector blends (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector variable blends. -defm : SKXWriteResPair; // Vector variable blends (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector MPSAD. -defm : SKXWriteResPair; // Vector MPSAD. +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Vector PSADBW. -defm : SKXWriteResPair; // Vector PSADBW. -defm : SKXWriteResPair; // Vector PSADBW. -defm : SKXWriteResPair; // Vector PHMINPOS. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; // Vector PHMINPOS. // Vector integer shifts. defm : SKXWriteResPair; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteRes; defm : SKXWriteResPair; -defm : SKXWriteResPair; // Vector integer immediate shifts (XMM). -defm : SKXWriteResPair; // Vector integer immediate shifts (YMM/ZMM). +defm : SKXWriteResPair; // Vector integer immediate shifts. +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; // Variable vector shifts. -defm : SKXWriteResPair; // Variable vector shifts (YMM/ZMM). +defm : SKXWriteResPair; +defm : SKXWriteResPair; // Vector insert/extract operations. def : WriteRes { @@ -343,36 +375,46 @@ } // Conversion between integer and float. -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; +defm : SKXWriteResPair; // Needs more work: DD vs DQ. +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; // Needs more work: DD vs DQ. defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; defm : SKXWriteResPair; -defm : SKXWriteResPair; +defm : SKXWriteResPair; +defm : SKXWriteResPair; defm : SKXWriteResPair; defm : SKXWriteResPair; -defm : SKXWriteResPair; - -defm : X86WriteRes; -defm : X86WriteRes; -defm : X86WriteRes; -defm : X86WriteRes; - -defm : X86WriteRes; -defm : X86WriteRes; -defm : X86WriteRes; -defm : X86WriteRes; +defm : SKXWriteResPair; +defm : SKXWriteResPair; + +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; + +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; // Strings instructions. @@ -564,7 +606,7 @@ let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>; +def: InstRW<[SKXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC, LAHF, SAHF)>; def: InstRW<[SKXWriteResGroup7], (instregex "BT(16|32|64)ri8", "BT(16|32|64)rr", "BTC(16|32|64)ri8", @@ -589,15 +631,15 @@ let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKXWriteResGroup9], (instregex "VBLENDMPD(Z|Z128|Z256)rr", - "VBLENDMPS(Z|Z128|Z256)rr", +def: InstRW<[SKXWriteResGroup9], (instregex "VBLENDMPD(Z128|Z256)rr", + "VBLENDMPS(Z128|Z256)rr", "VPADD(B|D|Q|W)(Y|Z|Z128|Z256)rr", "(V?)PADD(B|D|Q|W)rr", "VPBLENDD(Y?)rri", - "VPBLENDMB(Z|Z128|Z256)rr", - "VPBLENDMD(Z|Z128|Z256)rr", - "VPBLENDMQ(Z|Z128|Z256)rr", - "VPBLENDMW(Z|Z128|Z256)rr", + "VPBLENDMB(Z128|Z256)rr", + "VPBLENDMD(Z128|Z256)rr", + "VPBLENDMQ(Z128|Z256)rr", + "VPBLENDMW(Z128|Z256)rr", "VPSUB(B|D|Q|W)(Y|Z|Z128|Z256)rr", "(V?)PSUB(B|D|Q|W)rr", "VPTERNLOGD(Z|Z128|Z256)rri", @@ -610,9 +652,7 @@ } def: InstRW<[SKXWriteResGroup10], (instrs CBW, CWDE, CDQE, CMC, STC)>; -def: InstRW<[SKXWriteResGroup10], (instrs LAHF, SAHF)>; // TODO: This doesn't match Agner's data -def: InstRW<[SKXWriteResGroup10], (instregex "NOOP", - "SGDT64m", +def: InstRW<[SKXWriteResGroup10], (instregex "SGDT64m", "SIDT64m", "SMSW16m", "STRm", @@ -739,8 +779,7 @@ let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKXWriteResGroup30], (instregex "KADD(B|D|Q|W)rr", - "KMOV(B|D|Q|W)rk", +def: InstRW<[SKXWriteResGroup30], (instregex "KMOV(B|D|Q|W)rk", "KORTEST(B|D|Q|W)rr", "KTEST(B|D|Q|W)rr")>; @@ -768,6 +807,7 @@ let ResourceCycles = [1]; } def: InstRW<[SKXWriteResGroup32], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)", + "KADD(B|D|Q|W)rr", "KSHIFTL(B|D|Q|W)ri", "KSHIFTR(B|D|Q|W)ri", "KUNPCKBWrr", @@ -907,26 +947,44 @@ } def: InstRW<[SKXWriteResGroup49], (instregex "MUL_(FPrST0|FST0r|FrST0)")>; -def SKXWriteResGroup50 : SchedWriteRes<[SKXPort015]> { +def SKXWriteResGroup50 : SchedWriteRes<[SKXPort01]> { let Latency = 4; let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKXWriteResGroup50], (instregex "VCVTDQ2PS(Y|Z|Z128|Z256)rr", +def: InstRW<[SKXWriteResGroup50], (instregex "VCVTDQ2PS(Y|Z128|Z256)rr", "(V?)CVTDQ2PSrr", - "VCVTPD2QQ(Z|Z128|Z256)rr", - "VCVTPD2UQQ(Z|Z128|Z256)rr", - "VCVTPS2DQ(Y|Z|Z128|Z256)rr", + "VCVTPD2QQ(Z128|Z256)rr", + "VCVTPD2UQQ(Z128|Z256)rr", + "VCVTPS2DQ(Y|Z128|Z256)rr", "(V?)CVTPS2DQrr", - "VCVTPS2UDQ(Z|Z128|Z256)rr", - "VCVTQQ2PD(Z|Z128|Z256)rr", - "VCVTTPD2QQ(Z|Z128|Z256)rr", - "VCVTTPD2UQQ(Z|Z128|Z256)rr", - "VCVTTPS2DQ(Y|Z|Z128|Z256)rr", + "VCVTPS2UDQ(Z128|Z256)rr", + "VCVTQQ2PD(Z128|Z256)rr", + "VCVTTPD2QQ(Z128|Z256)rr", + "VCVTTPD2UQQ(Z128|Z256)rr", + "VCVTTPS2DQ(Z128|Z256)rr", "(V?)CVTTPS2DQrr", - "VCVTTPS2UDQ(Z|Z128|Z256)rr", - "VCVTUDQ2PS(Z|Z128|Z256)rr", - "VCVTUQQ2PD(Z|Z128|Z256)rr")>; + "VCVTTPS2UDQ(Z128|Z256)rr", + "VCVTUDQ2PS(Z128|Z256)rr", + "VCVTUQQ2PD(Z128|Z256)rr")>; + +def SKXWriteResGroup50z : SchedWriteRes<[SKXPort05]> { + let Latency = 4; + let NumMicroOps = 1; + let ResourceCycles = [1]; +} +def: InstRW<[SKXWriteResGroup50z], (instrs VCVTDQ2PSZrr, + VCVTPD2QQZrr, + VCVTPD2UQQZrr, + VCVTPS2DQZrr, + VCVTPS2UDQZrr, + VCVTQQ2PDZrr, + VCVTTPD2QQZrr, + VCVTTPD2UQQZrr, + VCVTTPS2DQZrr, + VCVTTPS2UDQZrr, + VCVTUDQ2PSZrr, + VCVTUQQ2PDZrr)>; def SKXWriteResGroup51 : SchedWriteRes<[SKXPort5]> { let Latency = 4; @@ -1010,13 +1068,6 @@ "MOVZX(16|32|64)rm8", "(V?)MOVDDUPrm")>; // TODO: Should this be SKXWriteResGroup71? -def SKXWriteResGroup59 : SchedWriteRes<[SKXPort015]> { - let Latency = 5; - let NumMicroOps = 2; - let ResourceCycles = [2]; -} -def: InstRW<[SKXWriteResGroup59], (instregex "VCVTSD2SSZrr")>; - def SKXWriteResGroup61 : SchedWriteRes<[SKXPort5,SKXPort015]> { let Latency = 5; let NumMicroOps = 2; @@ -1036,6 +1087,7 @@ "VCVTPS2UQQZ128rr", "VCVTQQ2PSZ128rr", "(V?)CVTSD2SSrr", + "VCVTSD2SSZrr", "(V?)CVTSI(64)?2SDrr", "VCVTSI2SSZrr", "(V?)CVTSI2SSrr", @@ -1136,7 +1188,7 @@ "VPBROADCASTDrm", "VPBROADCASTQrm")>; -def SKXWriteResGroup72 : SchedWriteRes<[SKXPort0]> { +def SKXWriteResGroup72 : SchedWriteRes<[SKXPort5]> { let Latency = 6; let NumMicroOps = 2; let ResourceCycles = [2]; @@ -1286,7 +1338,7 @@ "VPBROADCASTDYrm", "VPBROADCASTQYrm")>; -def SKXWriteResGroup90 : SchedWriteRes<[SKXPort0,SKXPort5]> { +def SKXWriteResGroup90 : SchedWriteRes<[SKXPort01,SKXPort5]> { let Latency = 7; let NumMicroOps = 2; let ResourceCycles = [1,1]; @@ -1318,21 +1370,40 @@ let NumMicroOps = 2; let ResourceCycles = [1,1]; } -def: InstRW<[SKXWriteResGroup93], (instregex "VCVTDQ2PD(Z|Z256)rr", - "VCVTPD2DQ(Y|Z|Z256)rr", - "VCVTPD2PS(Y|Z|Z256)rr", - "VCVTPD2UDQ(Z|Z256)rr", - "VCVTPS2PD(Y|Z|Z256)rr", - "VCVTPS2QQ(Z|Z256)rr", - "VCVTPS2UQQ(Z|Z256)rr", - "VCVTQQ2PS(Z|Z256)rr", - "VCVTTPD2DQ(Y|Z|Z256)rr", - "VCVTTPD2UDQ(Z|Z256)rr", - "VCVTTPS2QQ(Z|Z256)rr", - "VCVTTPS2UQQ(Z|Z256)rr", - "VCVTUDQ2PD(Z|Z256)rr", - "VCVTUQQ2PS(Z|Z256)rr")>; - +def: InstRW<[SKXWriteResGroup93], (instregex "VCVTDQ2PDZ256rr", + "VCVTPD2DQ(Y|Z256)rr", + "VCVTPD2PS(Y|Z256)rr", + "VCVTPD2UDQZ256rr", + "VCVTPS2PD(Y|Z256)rr", + "VCVTPS2QQZ256rr", + "VCVTPS2UQQZ256rr", + "VCVTQQ2PSZ256rr", + "VCVTTPD2DQ(Y|Z256)rr", + "VCVTTPD2UDQZ256rr", + "VCVTTPS2QQZ256rr", + "VCVTTPS2UQQZ256rr", + "VCVTUDQ2PDZ256rr", + "VCVTUQQ2PSZ256rr")>; + +def SKXWriteResGroup93z : SchedWriteRes<[SKXPort5,SKXPort05]> { + let Latency = 7; + let NumMicroOps = 2; + let ResourceCycles = [1,1]; +} +def: InstRW<[SKXWriteResGroup93z], (instregex "VCVTDQ2PDZrr", + "VCVTPD2DQZrr", + "VCVTPD2PSZrr", + "VCVTPD2UDQZrr", + "VCVTPS2PDZrr", + "VCVTPS2QQZrr", + "VCVTPS2UQQZrr", + "VCVTQQ2PSZrr", + "VCVTTPD2DQZrr", + "VCVTTPD2UDQZrr", + "VCVTTPS2QQZrr", + "VCVTTPS2UQQZrr", + "VCVTUDQ2PDZrr", + "VCVTUQQ2PSZrr")>; def SKXWriteResGroup95 : SchedWriteRes<[SKXPort23,SKXPort015]> { let Latency = 7; @@ -1405,8 +1476,8 @@ let ResourceCycles = [1,1,1]; } def: InstRW<[SKXWriteResGroup100], (instregex "VCVTSS2USI64Zrr", - "VCVTTSS2SI(64)?Zrr", - "(V?)CVTTSS2SI(64)?rr", + "(V?)CVTSS2SI64(Z?)rr", + "(V?)CVTTSS2SI64(Z?)rr", "VCVTTSS2USI64Zrr")>; def SKXWriteResGroup101 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05]> { @@ -1751,16 +1822,6 @@ def: InstRW<[SKXWriteResGroup137], (instregex "MMX_CVT(T?)PS2PIirm", "(V?)CVTPS2PDrm")>; -def SKXWriteResGroup138 : SchedWriteRes<[SKXPort0,SKXPort015]> { - let Latency = 9; - let NumMicroOps = 3; - let ResourceCycles = [2,1]; -} -def: InstRW<[SKXWriteResGroup138], (instregex "VRCP14PDZr(b?)", - "VRCP14PSZr(b?)", - "VRSQRT14PDZr(b?)", - "VRSQRT14PSZr(b?)")>; - def SKXWriteResGroup142 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort23]> { let Latency = 9; let NumMicroOps = 3; @@ -2009,12 +2070,19 @@ } def: InstRW<[SKXWriteResGroup171], (instrs LOOPE, LOOPNE)>; -def SKXWriteResGroup174 : SchedWriteRes<[SKXPort015]> { +def SKXWriteResGroup174 : SchedWriteRes<[SKXPort01]> { + let Latency = 12; + let NumMicroOps = 3; + let ResourceCycles = [3]; +} +def: InstRW<[SKXWriteResGroup174], (instregex "VPMULLQ(Z128|Z256)rr")>; + +def SKXWriteResGroup174z : SchedWriteRes<[SKXPort05]> { let Latency = 12; let NumMicroOps = 3; let ResourceCycles = [3]; } -def: InstRW<[SKXWriteResGroup174], (instregex "VPMULLQ(Z|Z128|Z256)rr")>; +def: InstRW<[SKXWriteResGroup174z], (instregex "VPMULLQZrr")>; def SKXWriteResGroup175 : SchedWriteRes<[SKXPort5,SKXPort23]> { let Latency = 12; @@ -2143,16 +2211,6 @@ } def: InstRW<[SKXWriteResGroup195], (instregex "RCL(8|16|32|64)mCL")>; -def SKXWriteResGroup198 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015]> { - let Latency = 16; - let NumMicroOps = 4; - let ResourceCycles = [2,1,1]; -} -def: InstRW<[SKXWriteResGroup198], (instregex "VRCP14PDZm(b?)", - "VRCP14PSZm(b?)", - "VRSQRT14PDZm(b?)", - "VRSQRT14PSZm(b?)")>; - def SKXWriteResGroup199 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> { let Latency = 16; let NumMicroOps = 14; Index: lib/Target/X86/X86Schedule.td =================================================================== --- lib/Target/X86/X86Schedule.td +++ lib/Target/X86/X86Schedule.td @@ -62,7 +62,6 @@ } } - // Multiclass that wraps X86FoldableSchedWrite for each vector width. class X86SchedWriteWidths Integer. defm WriteCvtPD2I : X86SchedWritePair; // Double -> Integer (XMM). -defm WriteCvtPD2IY : X86SchedWritePair; // Double -> Integer (YMM/ZMM). +defm WriteCvtPD2IY : X86SchedWritePair; // Double -> Integer (YMM). +defm WriteCvtPD2IZ : X86SchedWritePair; // Double -> Integer (ZMM). defm WriteCvtSS2I : X86SchedWritePair; // Float -> Integer. defm WriteCvtPS2I : X86SchedWritePair; // Float -> Integer (XMM). -defm WriteCvtPS2IY : X86SchedWritePair; // Float -> Integer (YMM/ZMM). +defm WriteCvtPS2IY : X86SchedWritePair; // Float -> Integer (YMM). +defm WriteCvtPS2IZ : X86SchedWritePair; // Float -> Integer (ZMM). defm WriteCvtI2SD : X86SchedWritePair; // Integer -> Double. defm WriteCvtI2PD : X86SchedWritePair; // Integer -> Double (XMM). -defm WriteCvtI2PDY : X86SchedWritePair; // Integer -> Double (YMM/ZMM). +defm WriteCvtI2PDY : X86SchedWritePair; // Integer -> Double (YMM). +defm WriteCvtI2PDZ : X86SchedWritePair; // Integer -> Double (ZMM). defm WriteCvtI2SS : X86SchedWritePair; // Integer -> Float. defm WriteCvtI2PS : X86SchedWritePair; // Integer -> Float (XMM). -defm WriteCvtI2PSY : X86SchedWritePair; // Integer -> Float (YMM/ZMM). +defm WriteCvtI2PSY : X86SchedWritePair; // Integer -> Float (YMM). +defm WriteCvtI2PSZ : X86SchedWritePair; // Integer -> Float (ZMM). defm WriteCvtSS2SD : X86SchedWritePair; // Float -> Double size conversion. defm WriteCvtPS2PD : X86SchedWritePair; // Float -> Double size conversion (XMM). -defm WriteCvtPS2PDY : X86SchedWritePair; // Float -> Double size conversion (YMM/ZMM). +defm WriteCvtPS2PDY : X86SchedWritePair; // Float -> Double size conversion (YMM). +defm WriteCvtPS2PDZ : X86SchedWritePair; // Float -> Double size conversion (ZMM). defm WriteCvtSD2SS : X86SchedWritePair; // Double -> Float size conversion. defm WriteCvtPD2PS : X86SchedWritePair; // Double -> Float size conversion (XMM). -defm WriteCvtPD2PSY : X86SchedWritePair; // Double -> Float size conversion (YMM/ZMM). +defm WriteCvtPD2PSY : X86SchedWritePair; // Double -> Float size conversion (YMM). +defm WriteCvtPD2PSZ : X86SchedWritePair; // Double -> Float size conversion (ZMM). defm WriteCvtPH2PS : X86SchedWritePair; // Half -> Float size conversion. -defm WriteCvtPH2PSY : X86SchedWritePair; // Half -> Float size conversion (YMM/ZMM). +defm WriteCvtPH2PSY : X86SchedWritePair; // Half -> Float size conversion (YMM). +defm WriteCvtPH2PSZ : X86SchedWritePair; // Half -> Float size conversion (ZMM). def WriteCvtPS2PH : SchedWrite; // // Float -> Half size conversion. -def WriteCvtPS2PHY : SchedWrite; // // Float -> Half size conversion (YMM/ZMM). +def WriteCvtPS2PHY : SchedWrite; // // Float -> Half size conversion (YMM). +def WriteCvtPS2PHZ : SchedWrite; // // Float -> Half size conversion (ZMM). def WriteCvtPS2PHSt : SchedWrite; // // Float -> Half + store size conversion. -def WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM/ZMM). +def WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM). +def WriteCvtPS2PHZSt : SchedWrite; // // Float -> Half + store size conversion (ZMM). // CRC32 instruction. defm WriteCRC32 : X86SchedWritePair; @@ -387,7 +427,8 @@ defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles. defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles. defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts. -defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM/ZMM). +defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM). +defm WriteVarVecShiftZ : X86SchedWritePair; // Variable vector shifts (ZMM). // Old microcoded instructions that nobody use. def WriteMicrocoded : SchedWrite; @@ -441,25 +482,25 @@ // Vector width wrappers. def SchedWriteFAdd - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFAdd64 - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFHAdd - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFCmp - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFCmp64 - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFMul - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFMul64 - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFMA - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteDPPD : X86SchedWriteWidths; def SchedWriteDPPS - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFDiv : X86SchedWriteWidths; def SchedWriteFDiv64 @@ -471,90 +512,90 @@ : X86SchedWriteWidths; def SchedWriteFRcp - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFRsqrt - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFRnd - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFLogic - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFTest - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFShuffle : X86SchedWriteWidths; + WriteFShuffleY, WriteFShuffleZ>; def SchedWriteFVarShuffle : X86SchedWriteWidths; + WriteFVarShuffleY, WriteFVarShuffleZ>; def SchedWriteFBlend - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteFVarBlend : X86SchedWriteWidths; + WriteFVarBlendY, WriteFVarBlendZ>; def SchedWriteCvtDQ2PD : X86SchedWriteWidths; + WriteCvtI2PDY, WriteCvtI2PDZ>; def SchedWriteCvtDQ2PS : X86SchedWriteWidths; + WriteCvtI2PSY, WriteCvtI2PSZ>; def SchedWriteCvtPD2DQ : X86SchedWriteWidths; + WriteCvtPD2IY, WriteCvtPD2IZ>; def SchedWriteCvtPS2DQ : X86SchedWriteWidths; + WriteCvtPS2IY, WriteCvtPS2IZ>; def SchedWriteCvtPS2PD : X86SchedWriteWidths; + WriteCvtPS2PDY, WriteCvtPS2PDZ>; def SchedWriteCvtPD2PS : X86SchedWriteWidths; + WriteCvtPD2PSY, WriteCvtPD2PSZ>; def SchedWriteVecALU - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWritePHAdd - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteVecLogic : X86SchedWriteWidths; + WriteVecLogicY, WriteVecLogicZ>; def SchedWriteVecTest : X86SchedWriteWidths; + WriteVecTestY, WriteVecTestZ>; def SchedWriteVecShift : X86SchedWriteWidths; + WriteVecShiftY, WriteVecShiftZ>; def SchedWriteVecShiftImm : X86SchedWriteWidths; + WriteVecShiftImmY, WriteVecShiftImmZ>; def SchedWriteVarVecShift : X86SchedWriteWidths; + WriteVarVecShiftY, WriteVarVecShiftZ>; def SchedWriteVecIMul : X86SchedWriteWidths; + WriteVecIMulY, WriteVecIMulZ>; def SchedWritePMULLD : X86SchedWriteWidths; + WritePMULLDY, WritePMULLDZ>; def SchedWriteMPSAD : X86SchedWriteWidths; + WriteMPSADY, WriteMPSADZ>; def SchedWritePSADBW : X86SchedWriteWidths; + WritePSADBWY, WritePSADBWZ>; def SchedWriteShuffle : X86SchedWriteWidths; + WriteShuffleY, WriteShuffleZ>; def SchedWriteVarShuffle : X86SchedWriteWidths; + WriteVarShuffleY, WriteVarShuffleZ>; def SchedWriteBlend - : X86SchedWriteWidths; + : X86SchedWriteWidths; def SchedWriteVarBlend : X86SchedWriteWidths; + WriteVarBlendY, WriteVarBlendZ>; // Vector size wrappers. def SchedWriteFAddSizes Index: lib/Target/X86/X86ScheduleAtom.td =================================================================== --- lib/Target/X86/X86ScheduleAtom.td +++ lib/Target/X86/X86ScheduleAtom.td @@ -210,28 +210,36 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; @@ -252,24 +260,33 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; @@ -280,30 +297,39 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResUnsupported; defm : X86WriteResUnsupported; defm : X86WriteResUnsupported; +defm : X86WriteResUnsupported; defm : X86WriteResUnsupported; +defm : X86WriteResUnsupported; //////////////////////////////////////////////////////////////////////////////// // Vector integer operations. @@ -334,42 +360,56 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; //////////////////////////////////////////////////////////////////////////////// // Vector insert/extract operations. Index: lib/Target/X86/X86ScheduleBtVer2.td =================================================================== --- lib/Target/X86/X86ScheduleBtVer2.td +++ lib/Target/X86/X86ScheduleBtVer2.td @@ -298,34 +298,44 @@ defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; @@ -346,18 +356,25 @@ defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : X86WriteResPairUnsupported; @@ -368,33 +385,42 @@ defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; // FIXME: f+3 ST, LD+STC latency defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; defm : X86WriteRes; defm : X86WriteRes; +defm : X86WriteResUnsupported; //////////////////////////////////////////////////////////////////////////////// // Vector integer operations. @@ -425,42 +451,56 @@ defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; -defm : JWriteResYMMPair; +defm : JWriteResYMMPair; +defm : X86WriteResPairUnsupported; defm : JWriteResFpuPair; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; //////////////////////////////////////////////////////////////////////////////// // Vector insert/extract operations. @@ -555,7 +595,7 @@ let Latency = 0; } -// Certain instructions that use the same register for both source +// Certain instructions that use the same register for both source // operands do not have a real dependency on the previous contents of the // register, and thus, do not have to wait before completing. They can be // optimized out at register renaming stage. Index: lib/Target/X86/X86ScheduleSLM.td =================================================================== --- lib/Target/X86/X86ScheduleSLM.td +++ lib/Target/X86/X86ScheduleSLM.td @@ -159,22 +159,28 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; @@ -186,9 +192,11 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; @@ -201,40 +209,52 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; // Conversion between integer and float. defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; // Vector integer operations. def : WriteRes { let Latency = 3; } @@ -260,37 +280,49 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; // FIXME: The below is closer to correct, but caused some perf regressions. //defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; // Vector insert/extract operations. @@ -309,9 +341,11 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteResPairUnsupported; // String instructions. // Packed Compare Implicit Length Strings, Return Mask @@ -407,25 +441,33 @@ // scheduling resources anyway. def : WriteRes; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : SLMWriteResPair; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; defm : X86WriteResPairUnsupported; +defm : X86WriteResPairUnsupported; defm : X86WriteResUnsupported; defm : X86WriteResUnsupported; +defm : X86WriteResUnsupported; defm : X86WriteResUnsupported; defm : X86WriteResUnsupported; +defm : X86WriteResUnsupported; } // SchedModel Index: lib/Target/X86/X86ScheduleZnver1.td =================================================================== --- lib/Target/X86/X86ScheduleZnver1.td +++ lib/Target/X86/X86ScheduleZnver1.td @@ -212,34 +212,45 @@ defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; //defm : ZnWriteResFpuPair; @@ -251,29 +262,39 @@ defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; // FIXME: Should folds require 1 extra uops? defm : ZnWriteResFpuPair; // FIXME: Should folds require 1 extra uops? +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; //defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; //defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; @@ -309,40 +330,52 @@ defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; // FIXME defm : ZnWriteResFpuPair; // FIXME +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; defm : ZnWriteResFpuPair; // Vector Shift Operations defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; +defm : X86WriteResPairUnsupported; // Vector insert/extract operations. defm : ZnWriteResFpuPair; @@ -1144,9 +1177,10 @@ // CVTPD2PS. // x,x. def : SchedAlias; - // y,y. def : SchedAlias; +// z,z. +defm : X86WriteResUnsupported; def ZnWriteCVTPD2PSLd: SchedWriteRes<[ZnAGU,ZnFPU03]> { let Latency = 11; @@ -1161,6 +1195,8 @@ let Latency = 11; } def : SchedAlias; +// z,m512 +defm : X86WriteResUnsupported; // CVTSD2SS. // x,x. @@ -1185,12 +1221,14 @@ } def : SchedAlias; def : SchedAlias; +defm : X86WriteResUnsupported; // y,x. def ZnWriteVCVTPS2PDY : SchedWriteRes<[ZnFPU3]> { let Latency = 3; } def : SchedAlias; +defm : X86WriteResUnsupported; // CVTSS2SD. // x,x. @@ -1288,17 +1326,21 @@ // x,v,i. def : SchedAlias; def : SchedAlias; +defm : X86WriteResUnsupported; // m,v,i. def : SchedAlias; def : SchedAlias; +defm : X86WriteResUnsupported; // VCVTPH2PS. // v,x. def : SchedAlias; def : SchedAlias; +defm : X86WriteResUnsupported; // v,m. def : SchedAlias; def : SchedAlias; +defm : X86WriteResUnsupported; //-- SSE4A instructions --// // EXTRQ