From: Simon Pilgrim Date: Mon, 24 Sep 2018 16:58:26 +0000 (+0000) Subject: [X86] Remove WriteDiv/WriteIDiv schedule overrides - use classes directly. NFCI. X-Git-Tag: llvmorg-8.0.0-rc1~8079 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a8b4e27760eb098141bdbb80b654aba100fb8229;p=platform%2Fupstream%2Fllvm.git [X86] Remove WriteDiv/WriteIDiv schedule overrides - use classes directly. NFCI. We're missing quite a bit of data for these instruction, removing the overrides makes this obvious - inconsistent reg/mem variants is a concern as well. Also, we have Divider resources (HWDivider etc.) but they aren't actually used consistently. llvm-svn: 342904 --- diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index 0efdd97..a1624b0 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -123,14 +123,24 @@ defm : BWWriteResPair; defm : BWWriteResPair; def : WriteRes { let Latency = 3; } -defm : BWWriteResPair; -defm : BWWriteResPair; -defm : BWWriteResPair; -defm : BWWriteResPair; -defm : BWWriteResPair; -defm : BWWriteResPair; -defm : BWWriteResPair; -defm : BWWriteResPair; +// TODO: Why isn't the BWDivider used consistently? +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; + +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; defm : X86WriteRes; defm : X86WriteRes; @@ -1520,13 +1530,6 @@ def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPor def: InstRW<[BWWriteResGroup186], (instrs XSAVE)>; def: InstRW<[BWWriteResGroup186], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>; -def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> { - let Latency = 34; - let NumMicroOps = 8; - let ResourceCycles = [2,2,2,1,1]; -} -def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>; - def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> { let Latency = 34; let NumMicroOps = 23; @@ -1535,13 +1538,6 @@ def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri", "IN(8|16|32)rr")>; -def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> { - let Latency = 35; - let NumMicroOps = 8; - let ResourceCycles = [2,2,2,1,1]; -} -def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>; - def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> { let Latency = 35; let NumMicroOps = 23; @@ -1585,13 +1581,6 @@ def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> { } def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>; -def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> { - let Latency = 80; - let NumMicroOps = 32; - let ResourceCycles = [7,7,3,3,1,11]; -} -def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>; - def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> { let Latency = 115; let NumMicroOps = 100; diff --git a/llvm/lib/Target/X86/X86SchedHaswell.td b/llvm/lib/Target/X86/X86SchedHaswell.td index e63916e..87f7919 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -185,14 +185,24 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; -defm : HWWriteResPair; -defm : HWWriteResPair; -defm : HWWriteResPair; -defm : HWWriteResPair; -defm : HWWriteResPair; -defm : HWWriteResPair; -defm : HWWriteResPair; -defm : HWWriteResPair; +// TODO: Why isn't the HWDivider used? +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; + +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; // Scalar and vector floating point. defm : X86WriteRes; @@ -631,22 +641,6 @@ def : InstRW<[HWWritePopA], (instregex "POPA(16|32)")>; //-- Arithmetic instructions --// -// DIV. -// r8. -def HWWriteDiv8 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { - let Latency = 22; - let NumMicroOps = 9; -} -def : InstRW<[HWWriteDiv8], (instrs DIV8r)>; - -// IDIV. -// r8. -def HWWriteIDiv8 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> { - let Latency = 23; - let NumMicroOps = 9; -} -def : InstRW<[HWWriteIDiv8], (instrs IDIV8r)>; - // BT. // m,r. def HWWriteBTmr : SchedWriteRes<[]> { @@ -1779,20 +1773,6 @@ def HWWriteResGroup180 : SchedWriteRes<[HWPort5,HWPort01,HWPort0156]> { } def: InstRW<[HWWriteResGroup180], (instrs FNINIT)>; -def HWWriteResGroup181 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort6,HWPort01,HWPort0156]> { - let Latency = 98; - let NumMicroOps = 32; - let ResourceCycles = [7,7,3,3,1,11]; -} -def: InstRW<[HWWriteResGroup181], (instregex "DIV(16|32|64)r")>; - -def HWWriteResGroup182 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort6,HWPort06,HWPort0156]> { - let Latency = 112; - let NumMicroOps = 66; - let ResourceCycles = [4,2,4,8,14,34]; -} -def: InstRW<[HWWriteResGroup182], (instregex "IDIV(16|32|64)r")>; - def HWWriteResGroup183 : SchedWriteRes<[HWPort0,HWPort1,HWPort4,HWPort5,HWPort6,HWPort237,HWPort06,HWPort0156]> { let Latency = 115; let NumMicroOps = 100; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeClient.td b/llvm/lib/Target/X86/X86SchedSkylakeClient.td index e05de50..b0fc3a2 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -128,14 +128,23 @@ defm : X86WriteRes; defm : X86WriteRes; defm : X86WriteRes; -defm : SKLWriteResPair; -defm : SKLWriteResPair; -defm : SKLWriteResPair; -defm : SKLWriteResPair; -defm : SKLWriteResPair; -defm : SKLWriteResPair; -defm : SKLWriteResPair; -defm : SKLWriteResPair; +// TODO: Why isn't the SKLDivider used? +defm : SKLWriteResPair; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; + +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; defm : SKLWriteResPair; @@ -1631,13 +1640,6 @@ def SKLWriteResGroup206 : SchedWriteRes<[SKLPort0,SKLPort23]> { } def: InstRW<[SKLWriteResGroup206], (instregex "DIVR_F(32|64)m")>; -def SKLWriteResGroup207 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort0156]> { - let Latency = 28; - let NumMicroOps = 8; - let ResourceCycles = [2,4,1,1]; -} -def: InstRW<[SKLWriteResGroup207], (instregex "IDIV(8|16|32|64)m")>; - def SKLWriteResGroup208 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> { let Latency = 30; let NumMicroOps = 3; @@ -1732,20 +1734,6 @@ def SKLWriteResGroup220 : SchedWriteRes<[SKLPort5,SKLPort05,SKLPort0156]> { } def: InstRW<[SKLWriteResGroup220], (instrs FNINIT)>; -def SKLWriteResGroup221 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> { - let Latency = 76; - let NumMicroOps = 32; - let ResourceCycles = [7,2,8,3,1,11]; -} -def: InstRW<[SKLWriteResGroup221], (instregex "DIV(16|32|64)r")>; - -def SKLWriteResGroup222 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> { - let Latency = 102; - let NumMicroOps = 66; - let ResourceCycles = [4,2,4,8,14,34]; -} -def: InstRW<[SKLWriteResGroup222], (instregex "IDIV(16|32|64)r")>; - def SKLWriteResGroup223 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort237,SKLPort06,SKLPort0156]> { let Latency = 106; let NumMicroOps = 100; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index e2ced7d..d34d790 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -129,14 +129,23 @@ defm : X86WriteRes; defm : X86WriteRes; defm : X86WriteRes; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; -defm : SKXWriteResPair; +// TODO: Why isn't the SKXDivider used? +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; +defm : X86WriteRes; +defm : X86WriteRes; defm : SKXWriteResPair; @@ -2303,13 +2312,6 @@ def SKXWriteResGroup240 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort01 def: InstRW<[SKXWriteResGroup240], (instrs VGATHERDPSZ256rm, VPGATHERDDZ256rm)>; -def SKXWriteResGroup241 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort0156]> { - let Latency = 28; - let NumMicroOps = 8; - let ResourceCycles = [2,4,1,1]; -} -def: InstRW<[SKXWriteResGroup241], (instregex "IDIV(8|16|32|64)m")>; - def SKXWriteResGroup242 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> { let Latency = 29; let NumMicroOps = 15; @@ -2442,20 +2444,6 @@ def SKXWriteResGroup263 : SchedWriteRes<[SKXPort5,SKXPort05,SKXPort0156]> { } def: InstRW<[SKXWriteResGroup263], (instrs FNINIT)>; -def SKXWriteResGroup264 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> { - let Latency = 76; - let NumMicroOps = 32; - let ResourceCycles = [7,2,8,3,1,11]; -} -def: InstRW<[SKXWriteResGroup264], (instregex "DIV(16|32|64)r")>; - -def SKXWriteResGroup265 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> { - let Latency = 102; - let NumMicroOps = 66; - let ResourceCycles = [4,2,4,8,14,34]; -} -def: InstRW<[SKXWriteResGroup265], (instregex "IDIV(16|32|64)r")>; - def SKXWriteResGroup266 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort237,SKXPort06,SKXPort0156]> { let Latency = 106; let NumMicroOps = 100;