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 @@ -10,6 +10,11 @@ // This file defines the machine model for Haswell to support instruction // scheduling and other instruction cost heuristics. // +// Note that we define some instructions here that are not supported by haswell, +// but we still have to define them because KNL uses the HSW model. +// They are currently tagged with a comment `Unsupported = 1`. +// FIXME: Use Unsupported = 1 once KNL has its own model. +// //===----------------------------------------------------------------------===// def HaswellModel : SchedMachineModel { @@ -203,11 +208,11 @@ defm : HWWriteResPair; 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; @@ -220,11 +225,11 @@ defm : HWWriteResPair; 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; Index: lib/Target/X86/X86SchedSandyBridge.td =================================================================== --- lib/Target/X86/X86SchedSandyBridge.td +++ lib/Target/X86/X86SchedSandyBridge.td @@ -10,6 +10,10 @@ // This file defines the machine model for Sandy Bridge to support instruction // scheduling and other instruction cost heuristics. // +// Note that we define some instructions here that are not supported by SNB, +// but we still have to define them because SNB is the default subtarget for +// X86. These instructions are tagged with a comment `Unsupported = 1`. +// //===----------------------------------------------------------------------===// def SandyBridgeModel : SchedMachineModel { @@ -195,11 +199,11 @@ defm : SBWriteResPair; 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; @@ -212,11 +216,11 @@ defm : SBWriteResPair; 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; 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,63 @@ // A folded store needs a cycle on Port0 for the store data. def : WriteRes; +//////////////////////////////////////////////////////////////////////////////// +// Unsupported. +//////////////////////////////////////////////////////////////////////////////// + +let Unsupported = 1 in { +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +def : WriteRes; +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; +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; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +} // Unsupported + //////////////////////////////////////////////////////////////////////////////// // Arithmetic. //////////////////////////////////////////////////////////////////////////////// @@ -90,7 +147,6 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. defm : AtomWriteResPair; defm : AtomWriteResPair; @@ -102,8 +158,6 @@ let ResourceCycles = [2]; } -def : WriteRes; // NOTE: Doesn't exist on Atom. - // This is for simple LEAs with one or two input operands. def : WriteRes; @@ -128,13 +182,6 @@ // Bit counts. defm : AtomWriteResPair; -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. - -// BMI1 BEXTR, BMI2 BZHI -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. //////////////////////////////////////////////////////////////////////////////// // Integer shifts and rotates. @@ -235,43 +282,22 @@ 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; defm : AtomWriteResPair; -defm : AtomWriteResPair; -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. defm : AtomWriteResPair; -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. +defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. //////////////////////////////////////////////////////////////////////////////// // Conversions. @@ -298,13 +324,6 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -def : WriteRes; // NOTE: Doesn't exist on Atom. -def : WriteRes; // NOTE: Doesn't exist on Atom. -def : WriteRes; // NOTE: Doesn't exist on Atom. -def : WriteRes; // NOTE: Doesn't exist on Atom. - //////////////////////////////////////////////////////////////////////////////// // Vector integer operations. //////////////////////////////////////////////////////////////////////////////// @@ -362,14 +381,6 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. //////////////////////////////////////////////////////////////////////////////// // Vector insert/extract operations. @@ -379,15 +390,6 @@ def : WriteRes; def : WriteRes; -//////////////////////////////////////////////////////////////////////////////// -// SSE42 String instructions. -//////////////////////////////////////////////////////////////////////////////// - -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. - //////////////////////////////////////////////////////////////////////////////// // MOVMSK Instructions. //////////////////////////////////////////////////////////////////////////////// @@ -397,14 +399,6 @@ def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } def : WriteRes { let Latency = 3; let ResourceCycles = [3]; } -//////////////////////////////////////////////////////////////////////////////// -// AES Instructions. -//////////////////////////////////////////////////////////////////////////////// - -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. - //////////////////////////////////////////////////////////////////////////////// // Horizontal add/sub instructions. //////////////////////////////////////////////////////////////////////////////// @@ -415,12 +409,6 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; -//////////////////////////////////////////////////////////////////////////////// -// Carry-less multiplication instructions. -//////////////////////////////////////////////////////////////////////////////// - -defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. - //////////////////////////////////////////////////////////////////////////////// // Load/store MXCSR. //////////////////////////////////////////////////////////////////////////////// Index: lib/Target/X86/X86ScheduleBtVer2.td =================================================================== --- lib/Target/X86/X86ScheduleBtVer2.td +++ lib/Target/X86/X86ScheduleBtVer2.td @@ -151,6 +151,26 @@ // A folded store needs a cycle on the SAGU for the store data. def : WriteRes; +//////////////////////////////////////////////////////////////////////////////// +// Unsupported. +//////////////////////////////////////////////////////////////////////////////// + +let Unsupported = 1 in { +defm : JWriteResFpuPair; +defm : JWriteResFpuPair; +defm : JWriteResFpuPair; +defm : JWriteResFpuPair; +defm : JWriteResFpuPair; +defm : JWriteResFpuPair; +defm : JWriteResFpuPair; +defm : JWriteResFpuPair; +defm : JWriteResIntPair; +defm : JWriteResIntPair; +defm : JWriteResIntPair; +defm : JWriteResIntPair; +defm : JWriteResIntPair; +} // Unsupported + //////////////////////////////////////////////////////////////////////////////// // Arithmetic. //////////////////////////////////////////////////////////////////////////////// @@ -190,7 +210,6 @@ // BMI1 BEXTR, BMI2 BZHI defm : JWriteResIntPair; -defm : JWriteResIntPair; // NOTE: Doesn't exist on Jaguar. //////////////////////////////////////////////////////////////////////////////// // Integer shifts and rotates. @@ -314,9 +333,6 @@ defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResYMMPair; @@ -329,19 +345,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; @@ -359,7 +371,6 @@ defm : JWriteResFpuPair; defm : JWriteResYMMPair; defm : JWriteResFpuPair; -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. //////////////////////////////////////////////////////////////////////////////// // Conversions. @@ -454,13 +465,9 @@ defm : JWriteResFpuPair; defm : JWriteResFpuPair; defm : JWriteResFpuPair; -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. defm : JWriteResFpuPair; defm : JWriteResYMMPair; defm : JWriteResFpuPair; -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. -defm : JWriteResFpuPair; // NOTE: Doesn't exist on Jaguar. //////////////////////////////////////////////////////////////////////////////// // Vector insert/extract operations. @@ -555,7 +562,7 @@ let Latency = 0; } -// Vector XOR instructions that use the same register for both source +// Vector XOR 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 @@ -75,6 +75,29 @@ } } +let Unsupported = 1 in { +def : WriteRes; +def : WriteRes; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +defm : SLMWriteResPair; +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; @@ -121,11 +144,6 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; -// BMI1 BEXTR, BMI2 BZHI -// NOTE: These don't exist on Silvermont. Ports are guesses. -defm : SLMWriteResPair; -defm : SLMWriteResPair; - defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; @@ -179,11 +197,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 +209,9 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; @@ -407,26 +421,12 @@ // AVX/FMA is not supported on that architecture, but we should define the basic // scheduling resources anyway. def : WriteRes; -defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; -defm : SLMWriteResPair; -defm : SLMWriteResPair; -defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; -defm : SLMWriteResPair; -defm : SLMWriteResPair; -defm : SLMWriteResPair; defm : SLMWriteResPair; -defm : SLMWriteResPair; def : WriteRes; -def : WriteRes; def : WriteRes; -def : WriteRes; } // SchedModel 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