From 974a7014d8b00607f09f3f42f869e7ceea46bf61 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Sat, 12 May 2018 18:07:07 +0000 Subject: [PATCH] [X86] Add WriteFCMOV scheduler class for x87 CMOVs git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@332173 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86InstrFPStack.td | 2 +- lib/Target/X86/X86SchedBroadwell.td | 2 ++ lib/Target/X86/X86SchedHaswell.td | 1 + lib/Target/X86/X86SchedSandyBridge.td | 8 +------- lib/Target/X86/X86SchedSkylakeClient.td | 4 ++-- lib/Target/X86/X86SchedSkylakeServer.td | 4 ++-- lib/Target/X86/X86Schedule.td | 1 + lib/Target/X86/X86ScheduleAtom.td | 4 ++-- lib/Target/X86/X86ScheduleBtVer2.td | 1 + lib/Target/X86/X86ScheduleSLM.td | 1 + lib/Target/X86/X86ScheduleZnver1.td | 3 +-- 11 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/Target/X86/X86InstrFPStack.td b/lib/Target/X86/X86InstrFPStack.td index aedd445b714..0cc6272d89a 100644 --- a/lib/Target/X86/X86InstrFPStack.td +++ b/lib/Target/X86/X86InstrFPStack.td @@ -384,7 +384,7 @@ multiclass FPCMov { } let Defs = [FPSW] in { -let SchedRW = [WriteFAdd] in { +let SchedRW = [WriteFCMOV] in { let Uses = [EFLAGS], Constraints = "$src1 = $dst" in { defm CMOVB : FPCMov; defm CMOVBE : FPCMov; diff --git a/lib/Target/X86/X86SchedBroadwell.td b/lib/Target/X86/X86SchedBroadwell.td index 268f60b8237..7efc3a28481 100755 --- a/lib/Target/X86/X86SchedBroadwell.td +++ b/lib/Target/X86/X86SchedBroadwell.td @@ -125,6 +125,8 @@ def : WriteRes { let Latency = 3; } // Integer multiplication, h def : WriteRes; // LEA instructions can't fold loads. defm : BWWriteResPair; // Conditional move. +defm : X86WriteRes; // x87 conditional move. + def : WriteRes; // Setcc. def : WriteRes { let Latency = 2; diff --git a/lib/Target/X86/X86SchedHaswell.td b/lib/Target/X86/X86SchedHaswell.td index 7b84757baa3..0a64f2a37fe 100644 --- a/lib/Target/X86/X86SchedHaswell.td +++ b/lib/Target/X86/X86SchedHaswell.td @@ -121,6 +121,7 @@ defm : HWWriteResPair; defm : HWWriteResPair; defm : HWWriteResPair; // Conditional move. +defm : X86WriteRes; // x87 conditional move. def : WriteRes; // Setcc. def : WriteRes { let Latency = 2; diff --git a/lib/Target/X86/X86SchedSandyBridge.td b/lib/Target/X86/X86SchedSandyBridge.td index 74a5824a036..be380ffa2ff 100644 --- a/lib/Target/X86/X86SchedSandyBridge.td +++ b/lib/Target/X86/X86SchedSandyBridge.td @@ -121,6 +121,7 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; // Conditional move. +defm : X86WriteRes; // x87 conditional move. def : WriteRes; // Setcc. def : WriteRes { 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/lib/Target/X86/X86SchedSkylakeClient.td b/lib/Target/X86/X86SchedSkylakeClient.td index e8da8b807aa..e5019938dbd 100644 --- a/lib/Target/X86/X86SchedSkylakeClient.td +++ b/lib/Target/X86/X86SchedSkylakeClient.td @@ -124,6 +124,7 @@ def : WriteRes { let Latency = 3; } // Integer multiplication, h def : WriteRes; // LEA instructions can't fold loads. defm : SKLWriteResPair; // Conditional move. +defm : X86WriteRes; // x87 conditional move. def : WriteRes; // Setcc. def : WriteRes { 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/lib/Target/X86/X86SchedSkylakeServer.td b/lib/Target/X86/X86SchedSkylakeServer.td index ce3c5104900..4bd95ea494d 100755 --- a/lib/Target/X86/X86SchedSkylakeServer.td +++ b/lib/Target/X86/X86SchedSkylakeServer.td @@ -124,6 +124,7 @@ def : WriteRes { let Latency = 3; } // Integer multiplication, h def : WriteRes; // LEA instructions can't fold loads. defm : SKXWriteResPair; // Conditional move. +defm : X86WriteRes; // x87 conditional move. def : WriteRes; // Setcc. def : WriteRes { 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/lib/Target/X86/X86Schedule.td b/lib/Target/X86/X86Schedule.td index f23b37ddce7..a0a9a911788 100644 --- a/lib/Target/X86/X86Schedule.td +++ b/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/lib/Target/X86/X86ScheduleAtom.td b/lib/Target/X86/X86ScheduleAtom.td index e81bb3605bf..b69a6281fd4 100644 --- a/lib/Target/X86/X86ScheduleAtom.td +++ b/lib/Target/X86/X86ScheduleAtom.td @@ -92,6 +92,7 @@ defm : AtomWriteResPair; // NOTE: Doesn't exist on Atom. defm : AtomWriteResPair; +defm : X86WriteRes; // x87 conditional move. def : WriteRes; def : WriteRes { @@ -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/lib/Target/X86/X86ScheduleBtVer2.td b/lib/Target/X86/X86ScheduleBtVer2.td index 01e41b9621f..112b0ebf4b2 100644 --- a/lib/Target/X86/X86ScheduleBtVer2.td +++ b/lib/Target/X86/X86ScheduleBtVer2.td @@ -172,6 +172,7 @@ defm : JWriteResIntPair; defm : JWriteResIntPair; defm : JWriteResIntPair; // Conditional move. +defm : X86WriteRes; // x87 conditional move. def : WriteRes; // Setcc. def : WriteRes; diff --git a/lib/Target/X86/X86ScheduleSLM.td b/lib/Target/X86/X86ScheduleSLM.td index 396eb9fd814..ab39b241864 100644 --- a/lib/Target/X86/X86ScheduleSLM.td +++ b/lib/Target/X86/X86ScheduleSLM.td @@ -100,6 +100,7 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteRes; // x87 conditional move. def : WriteRes; def : WriteRes { // FIXME Latency and NumMicrOps? diff --git a/lib/Target/X86/X86ScheduleZnver1.td b/lib/Target/X86/X86ScheduleZnver1.td index 9af8373f549..0e68fabb017 100644 --- a/lib/Target/X86/X86ScheduleZnver1.td +++ b/lib/Target/X86/X86ScheduleZnver1.td @@ -367,6 +367,7 @@ def ZnWriteMicrocoded : SchedWriteRes<[]> { } def : SchedAlias; +def : SchedAlias; def : SchedAlias; def : SchedAlias; def : SchedAlias; @@ -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)>; -- 2.11.0