Index: lib/Target/X86/X86SchedBroadwell.td =================================================================== --- lib/Target/X86/X86SchedBroadwell.td +++ lib/Target/X86/X86SchedBroadwell.td @@ -105,6 +105,14 @@ // 2/3/7 cycle to recompute the address. def : WriteRes; +// Unsupported. +let Unsupported = 1 in { +defm : BWWriteResPair; +defm : BWWriteResPair; +defm : BWWriteResPair; +defm : BWWriteResPair; +} // Unsupported + // Arithmetic. defm : BWWriteResPair; // Simple integer ALU op. defm : BWWriteResPair; // Integer ALU + flags op. @@ -212,22 +220,18 @@ //defm : BWWriteResPair; // Floating point division. defm : BWWriteResPair; // Floating point division (XMM). defm : BWWriteResPair; // Floating point division (YMM). -defm : BWWriteResPair; // Floating point division (ZMM). //defm : BWWriteResPair; // Floating point division. defm : BWWriteResPair; // Floating point division (XMM). defm : BWWriteResPair; // Floating point division (YMM). -defm : BWWriteResPair; // Floating point division (ZMM). defm : X86WriteRes; // Floating point square root. defm : X86WriteRes; defm : BWWriteResPair; // Floating point square root (XMM). defm : BWWriteResPair; // Floating point square root (YMM). -defm : BWWriteResPair; // Floating point square root (ZMM). defm : X86WriteRes; // Floating point double square root. defm : X86WriteRes; defm : BWWriteResPair; // Floating point double square root (XMM). defm : BWWriteResPair; // Floating point double square root (YMM). -defm : BWWriteResPair; // Floating point double square root (ZMM). defm : BWWriteResPair; // Floating point long double square root. defm : BWWriteResPair; // Floating point reciprocal estimate. @@ -1688,4 +1692,3 @@ def: InstRW<[WriteZero], (instrs CLC)>; } // SchedModel - Index: lib/Target/X86/X86SchedHaswell.td =================================================================== --- lib/Target/X86/X86SchedHaswell.td +++ lib/Target/X86/X86SchedHaswell.td @@ -136,6 +136,14 @@ // the port to read all inputs. We don't model that. def : WriteRes; +// Unsupported. +let Unsupported = 1 in { +defm : HWWriteResPair; +defm : HWWriteResPair; +defm : HWWriteResPair; +defm : HWWriteResPair; +} // Unsupported + // Bit counts. defm : HWWriteResPair; defm : HWWriteResPair; @@ -203,11 +211,9 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; -defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; -defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; @@ -220,11 +226,9 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; -defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; -defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; Index: lib/Target/X86/X86SchedSandyBridge.td =================================================================== --- lib/Target/X86/X86SchedSandyBridge.td +++ lib/Target/X86/X86SchedSandyBridge.td @@ -96,6 +96,14 @@ // 2/3 cycle to recompute the address. def : WriteRes; +// The following classes are for instruction that are not supported by SNB, but +// we still have to define them because SNB is the default subtarget for X86. +defm : SBWriteResPair; +defm : SBWriteResPair; +defm : SBWriteResPair; +defm : SBWriteResPair; + + def : WriteRes; def : WriteRes; def : WriteRes { let Latency = 5; } @@ -195,11 +203,9 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; -defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; -defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; @@ -212,11 +218,9 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; -defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; -defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; Index: lib/Target/X86/X86SchedSkylakeClient.td =================================================================== --- lib/Target/X86/X86SchedSkylakeClient.td +++ lib/Target/X86/X86SchedSkylakeClient.td @@ -104,6 +104,14 @@ // 2/3/7 cycle to recompute the address. def : WriteRes; +// Unsupported. +let Unsupported = 1 in { +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : SKLWriteResPair; +defm : SKLWriteResPair; +} // Unsupported + // Arithmetic. defm : SKLWriteResPair; // Simple integer ALU op. defm : SKLWriteResPair; // Integer ALU + flags op. @@ -208,20 +216,16 @@ defm : SKLWriteResPair; // Floating point division. //defm : SKLWriteResPair; // Floating point division (XMM). defm : SKLWriteResPair; // Floating point division (YMM). -defm : SKLWriteResPair; // Floating point division (ZMM). //defm : SKLWriteResPair; // Floating point double division. //defm : SKLWriteResPair; // Floating point double division (XMM). //defm : SKLWriteResPair; // Floating point double division (YMM). -defm : SKLWriteResPair; // Floating point double division (ZMM). defm : SKLWriteResPair; // Floating point square root. defm : SKLWriteResPair; // Floating point square root (XMM). defm : SKLWriteResPair; // Floating point square root (YMM). -defm : SKLWriteResPair; // Floating point square root (ZMM). 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; // Floating point double square root (ZMM). defm : SKLWriteResPair; // Floating point long double square root. defm : SKLWriteResPair; // Floating point reciprocal estimate. Index: lib/Target/X86/X86ScheduleAtom.td =================================================================== --- lib/Target/X86/X86ScheduleAtom.td +++ lib/Target/X86/X86ScheduleAtom.td @@ -72,6 +72,17 @@ // A folded store needs a cycle on Port0 for the store data. def : WriteRes; +//////////////////////////////////////////////////////////////////////////////// +// Unsupported. +//////////////////////////////////////////////////////////////////////////////// + +let Unsupported = 1 in { +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +} // Unsupported + //////////////////////////////////////////////////////////////////////////////// // Arithmetic. //////////////////////////////////////////////////////////////////////////////// @@ -235,19 +246,15 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; Index: lib/Target/X86/X86ScheduleBtVer2.td =================================================================== --- lib/Target/X86/X86ScheduleBtVer2.td +++ lib/Target/X86/X86ScheduleBtVer2.td @@ -151,6 +151,17 @@ // A folded store needs a cycle on the SAGU for the store data. def : WriteRes; +//////////////////////////////////////////////////////////////////////////////// +// Unsupported. +//////////////////////////////////////////////////////////////////////////////// + +let Unsupported = 1 in { +defm : JWriteResIntPair; +defm : JWriteResIntPair; +defm : JWriteResIntPair; +defm : JWriteResIntPair; +} // Unsupported + //////////////////////////////////////////////////////////////////////////////// // Arithmetic. //////////////////////////////////////////////////////////////////////////////// @@ -329,19 +340,15 @@ defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; -defm : JWriteResYMMPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; -defm : JWriteResYMMPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; -defm : JWriteResYMMPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; -defm : JWriteResYMMPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; @@ -547,4 +554,3 @@ } def : InstRW<[JWriteJVZEROUPPER], (instrs VZEROUPPER)>; } // SchedModel - Index: lib/Target/X86/X86ScheduleSLM.td =================================================================== --- lib/Target/X86/X86ScheduleSLM.td +++ lib/Target/X86/X86ScheduleSLM.td @@ -75,6 +75,13 @@ } } +let Unsupported = 1 in { +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +} // Unsupported + // A folded store needs a cycle on MEC_RSV for the store data, but it does not // need an extra port cycle to recompute the address. def : WriteRes; @@ -179,11 +186,9 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; @@ -193,11 +198,9 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; Index: lib/Target/X86/X86ScheduleZnver1.td =================================================================== --- lib/Target/X86/X86ScheduleZnver1.td +++ lib/Target/X86/X86ScheduleZnver1.td @@ -139,6 +139,13 @@ } } +let Unsupported = 1 in { +defm : ZnWriteResPair; +defm : ZnWriteResPair; +defm : ZnWriteResPair; +defm : ZnWriteResPair; +} // Unsupported + // WriteRMW is set for instructions with Memory write // operation in codegen def : WriteRes; @@ -243,11 +250,9 @@ defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; //defm : ZnWriteResFpuPair; -defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; //defm : ZnWriteResFpuPair; -defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; // FIXME: Should folds require 1 extra uops? defm : ZnWriteResFpuPair; // FIXME: Should folds require 1 extra uops? @@ -277,11 +282,9 @@ defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; -defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; -defm : ZnWriteResFpuPair; defm : ZnWriteResFpuPair; // Vector integer operations which uses FPU units Index: test/CodeGen/X86/recip-fastmath.ll =================================================================== --- test/CodeGen/X86/recip-fastmath.ll +++ test/CodeGen/X86/recip-fastmath.ll @@ -895,7 +895,7 @@ ; KNL-LABEL: v16f32_no_estimate: ; KNL: # %bb.0: ; KNL-NEXT: vbroadcastss {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] sched: [10:1.00] -; KNL-NEXT: vdivps %zmm0, %zmm1, %zmm0 # sched: [21:14.00] +; KNL-NEXT: vdivps %zmm0, %zmm1, %zmm0 # sched: [0:?] ; KNL-NEXT: retq # sched: [7:1.00] ; ; SKX-LABEL: v16f32_no_estimate: