diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-05-12 18:07:07 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-05-12 18:07:07 +0000 |
| commit | 6e160c18132cb6eca556b54ed0cec08698cb26b1 (patch) | |
| tree | 96b838595e041a6674df0e34ff46af81a23250e0 | |
| parent | 65cc0cb31f32ae21f976a41fa0ae48b2028086ef (diff) | |
| download | llvm-6e160c18132cb6eca556b54ed0cec08698cb26b1.zip llvm-6e160c18132cb6eca556b54ed0cec08698cb26b1.tar.gz llvm-6e160c18132cb6eca556b54ed0cec08698cb26b1.tar.bz2 | |
[X86] Add WriteFCMOV scheduler class for x87 CMOVs
llvm-svn: 332173
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrFPStack.td | 2 | ||||
| -rwxr-xr-x | llvm/lib/Target/X86/X86SchedBroadwell.td | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedHaswell.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedSandyBridge.td | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedSkylakeClient.td | 4 | ||||
| -rwxr-xr-x | llvm/lib/Target/X86/X86SchedSkylakeServer.td | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86Schedule.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleAtom.td | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBtVer2.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleSLM.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleZnver1.td | 3 |
11 files changed, 15 insertions, 16 deletions
diff --git a/llvm/lib/Target/X86/X86InstrFPStack.td b/llvm/lib/Target/X86/X86InstrFPStack.td index aedd445..0cc6272 100644 --- a/llvm/lib/Target/X86/X86InstrFPStack.td +++ b/llvm/lib/Target/X86/X86InstrFPStack.td @@ -384,7 +384,7 @@ multiclass FPCMov<PatLeaf cc> { } let Defs = [FPSW] in { -let SchedRW = [WriteFAdd] in { +let SchedRW = [WriteFCMOV] in { let Uses = [EFLAGS], Constraints = "$src1 = $dst" in { defm CMOVB : FPCMov<X86_COND_B>; defm CMOVBE : FPCMov<X86_COND_BE>; diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index 268f60b..7efc3a2 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -125,6 +125,8 @@ def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, h def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads. defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move. +defm : X86WriteRes<WriteFCMOV, [BWPort1], 3, [1], 1>; // x87 conditional move. + def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc. def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> { let Latency = 2; diff --git a/llvm/lib/Target/X86/X86SchedHaswell.td b/llvm/lib/Target/X86/X86SchedHaswell.td index 7b84757..0a64f2a 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -121,6 +121,7 @@ defm : HWWriteResPair<WriteJump, [HWPort06], 1>; defm : HWWriteResPair<WriteCRC32, [HWPort1], 3>; defm : HWWriteResPair<WriteCMOV, [HWPort06,HWPort0156], 2, [1,1], 2>; // Conditional move. +defm : X86WriteRes<WriteFCMOV, [HWPort1], 3, [1], 1>; // x87 conditional move. def : WriteRes<WriteSETCC, [HWPort06]>; // Setcc. def : WriteRes<WriteSETCCStore, [HWPort06,HWPort4,HWPort237]> { let Latency = 2; diff --git a/llvm/lib/Target/X86/X86SchedSandyBridge.td b/llvm/lib/Target/X86/X86SchedSandyBridge.td index 74a5824..be380ff 100644 --- a/llvm/lib/Target/X86/X86SchedSandyBridge.td +++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td @@ -121,6 +121,7 @@ defm : SBWriteResPair<WriteJump, [SBPort5], 1>; defm : SBWriteResPair<WriteCRC32, [SBPort1], 3, [1], 1, 5>; defm : SBWriteResPair<WriteCMOV, [SBPort05,SBPort015], 2, [1,1], 2>; // Conditional move. +defm : X86WriteRes<WriteFCMOV, [SBPort5,SBPort05], 3, [2,1], 3>; // x87 conditional move. def : WriteRes<WriteSETCC, [SBPort05]>; // Setcc. def : WriteRes<WriteSETCCStore, [SBPort05,SBPort4,SBPort23]> { let Latency = 2; @@ -640,13 +641,6 @@ def SBWriteResGroup25_1 : SchedWriteRes<[SBPort23,SBPort015]> { } def: InstRW<[SBWriteResGroup25_1], (instrs LEAVE, LEAVE64)>; -def SBWriteResGroup25_2 : SchedWriteRes<[SBPort5,SBPort05]> { - let Latency = 3; - let NumMicroOps = 3; - let ResourceCycles = [2,1]; -} -def: InstRW<[SBWriteResGroup25_2], (instregex "CMOV(N?)(B|BE|E|P)_F")>; - def SBWriteResGroup26 : SchedWriteRes<[SBPort05,SBPort015]> { let Latency = 3; let NumMicroOps = 3; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeClient.td b/llvm/lib/Target/X86/X86SchedSkylakeClient.td index e8da8b8..e501993 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -124,6 +124,7 @@ def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, h def : WriteRes<WriteLEA, [SKLPort15]>; // LEA instructions can't fold loads. defm : SKLWriteResPair<WriteCMOV, [SKLPort06], 1>; // Conditional move. +defm : X86WriteRes<WriteFCMOV, [SKLPort1], 3, [1], 1>; // x87 conditional move. def : WriteRes<WriteSETCC, [SKLPort06]>; // Setcc. def : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> { let Latency = 2; @@ -704,8 +705,7 @@ def SKLWriteResGroup29 : SchedWriteRes<[SKLPort1]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKLWriteResGroup29], (instregex "CMOV(N?)(B|BE|E|P)_F", - "PDEP(32|64)rr", +def: InstRW<[SKLWriteResGroup29], (instregex "PDEP(32|64)rr", "PEXT(32|64)rr", "SHLD(16|32|64)rri8", "SHRD(16|32|64)rri8")>; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index ce3c510..4bd95ea 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -124,6 +124,7 @@ def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, h def : WriteRes<WriteLEA, [SKXPort15]>; // LEA instructions can't fold loads. defm : SKXWriteResPair<WriteCMOV, [SKXPort06], 1>; // Conditional move. +defm : X86WriteRes<WriteFCMOV, [SKXPort1], 3, [1], 1>; // x87 conditional move. def : WriteRes<WriteSETCC, [SKXPort06]>; // Setcc. def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> { let Latency = 2; @@ -754,8 +755,7 @@ def SKXWriteResGroup31 : SchedWriteRes<[SKXPort1]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKXWriteResGroup31], (instregex "CMOV(N?)(B|BE|E|P)_F", - "PDEP(32|64)rr", +def: InstRW<[SKXWriteResGroup31], (instregex "PDEP(32|64)rr", "PEXT(32|64)rr", "SHLD(16|32|64)rri8", "SHRD(16|32|64)rri8")>; diff --git a/llvm/lib/Target/X86/X86Schedule.td b/llvm/lib/Target/X86/X86Schedule.td index f23b37d..a0a9a91 100644 --- a/llvm/lib/Target/X86/X86Schedule.td +++ b/llvm/lib/Target/X86/X86Schedule.td @@ -117,6 +117,7 @@ defm WritePOPCNT : X86SchedWritePair; // Bit population count. defm WriteLZCNT : X86SchedWritePair; // Leading zero count. defm WriteTZCNT : X86SchedWritePair; // Trailing zero count. defm WriteCMOV : X86SchedWritePair; // Conditional move. +def WriteFCMOV : SchedWrite; // X87 conditional move. def WriteSETCC : SchedWrite; // Set register based on condition code. def WriteSETCCStore : SchedWrite; diff --git a/llvm/lib/Target/X86/X86ScheduleAtom.td b/llvm/lib/Target/X86/X86ScheduleAtom.td index e81bb36..b69a628 100644 --- a/llvm/lib/Target/X86/X86ScheduleAtom.td +++ b/llvm/lib/Target/X86/X86ScheduleAtom.td @@ -92,6 +92,7 @@ defm : AtomWriteResPair<WriteIDiv64, [AtomPort01], [AtomPort01],130,130,[130],[1 defm : AtomWriteResPair<WriteCRC32, [AtomPort01], [AtomPort01]>; // NOTE: Doesn't exist on Atom. defm : AtomWriteResPair<WriteCMOV, [AtomPort01], [AtomPort0]>; +defm : X86WriteRes<WriteFCMOV, [AtomPort01], 9, [9], 1>; // x87 conditional move. def : WriteRes<WriteSETCC, [AtomPort01]>; def : WriteRes<WriteSETCCStore, [AtomPort01]> { @@ -593,8 +594,7 @@ def : InstRW<[AtomWrite01_9], (instrs BT16mr, BT32mr, BT64mr, SHLD64mri8, SHRD64mri8, SHLD64rri8, SHRD64rri8, CMPXCHG8rr)>; -def : InstRW<[AtomWrite01_9], (instregex "CMOV(B|BE|E|P|NB|NBE|NE|NP)_F", - "(U)?COM_FI", "TST_F", +def : InstRW<[AtomWrite01_9], (instregex "(U)?COM_FI", "TST_F", "(U)?COMIS(D|S)rr", "CVT(T)?SS2SI64rr(_Int)?")>; diff --git a/llvm/lib/Target/X86/X86ScheduleBtVer2.td b/llvm/lib/Target/X86/X86ScheduleBtVer2.td index 01e41b9..112b0eb 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -172,6 +172,7 @@ defm : JWriteResIntPair<WriteIDiv64, [JALU1, JDiv], 41, [1, 41], 2>; defm : JWriteResIntPair<WriteCRC32, [JALU01], 3, [4], 3>; defm : JWriteResIntPair<WriteCMOV, [JALU01], 1>; // Conditional move. +defm : X86WriteRes<WriteFCMOV, [JFPU0, JFPA], 3, [1,1], 1>; // x87 conditional move. def : WriteRes<WriteSETCC, [JALU01]>; // Setcc. def : WriteRes<WriteSETCCStore, [JALU01,JSAGU]>; diff --git a/llvm/lib/Target/X86/X86ScheduleSLM.td b/llvm/lib/Target/X86/X86ScheduleSLM.td index 396eb9f..ab39b24 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -100,6 +100,7 @@ defm : SLMWriteResPair<WriteJump, [SLM_IEC_RSV1], 1>; defm : SLMWriteResPair<WriteCRC32, [SLM_IEC_RSV1], 3>; defm : SLMWriteResPair<WriteCMOV, [SLM_IEC_RSV01], 2, [2]>; +defm : X86WriteRes<WriteFCMOV, [SLM_FPC_RSV1], 3, [1], 1>; // x87 conditional move. def : WriteRes<WriteSETCC, [SLM_IEC_RSV01]>; def : WriteRes<WriteSETCCStore, [SLM_IEC_RSV01, SLM_MEC_RSV]> { // FIXME Latency and NumMicrOps? diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td index 9af8373..0e68fab 100644 --- a/llvm/lib/Target/X86/X86ScheduleZnver1.td +++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td @@ -367,6 +367,7 @@ def ZnWriteMicrocoded : SchedWriteRes<[]> { } def : SchedAlias<WriteMicrocoded, ZnWriteMicrocoded>; +def : SchedAlias<WriteFCMOV, ZnWriteMicrocoded>; def : SchedAlias<WriteSystem, ZnWriteMicrocoded>; def : SchedAlias<WriteMPSAD, ZnWriteMicrocoded>; def : SchedAlias<WriteMPSADY, ZnWriteMicrocoded>; @@ -802,8 +803,6 @@ def : InstRW<[ZnWriteFPU3], (instregex "LD_F1")>; // FLDPI FLDL2E etc. def : InstRW<[ZnWriteFPU3], (instregex "FLDPI", "FLDL2(T|E)", "FLDL(G|N)2")>; -def : InstRW<[WriteMicrocoded], (instregex "CMOV(B|BE|E|P|NB|NBE|NE|NP)_F")>; - // FNSTSW. // AX. def : InstRW<[WriteMicrocoded], (instrs FNSTSW16r)>; |
