forked from OSchip/llvm-project
[X86] Add WriteFCMOV scheduler class for x87 CMOVs
llvm-svn: 332173
This commit is contained in:
parent
65cc0cb31f
commit
6e160c1813
|
@ -384,7 +384,7 @@ multiclass FPCMov<PatLeaf cc> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let Defs = [FPSW] in {
|
let Defs = [FPSW] in {
|
||||||
let SchedRW = [WriteFAdd] in {
|
let SchedRW = [WriteFCMOV] in {
|
||||||
let Uses = [EFLAGS], Constraints = "$src1 = $dst" in {
|
let Uses = [EFLAGS], Constraints = "$src1 = $dst" in {
|
||||||
defm CMOVB : FPCMov<X86_COND_B>;
|
defm CMOVB : FPCMov<X86_COND_B>;
|
||||||
defm CMOVBE : FPCMov<X86_COND_BE>;
|
defm CMOVBE : FPCMov<X86_COND_BE>;
|
||||||
|
|
|
@ -125,6 +125,8 @@ def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, h
|
||||||
def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
|
def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
|
||||||
|
|
||||||
defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
|
defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
|
||||||
|
defm : X86WriteRes<WriteFCMOV, [BWPort1], 3, [1], 1>; // x87 conditional move.
|
||||||
|
|
||||||
def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
|
def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
|
||||||
def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
|
def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
|
||||||
let Latency = 2;
|
let Latency = 2;
|
||||||
|
|
|
@ -121,6 +121,7 @@ defm : HWWriteResPair<WriteJump, [HWPort06], 1>;
|
||||||
defm : HWWriteResPair<WriteCRC32, [HWPort1], 3>;
|
defm : HWWriteResPair<WriteCRC32, [HWPort1], 3>;
|
||||||
|
|
||||||
defm : HWWriteResPair<WriteCMOV, [HWPort06,HWPort0156], 2, [1,1], 2>; // Conditional move.
|
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<WriteSETCC, [HWPort06]>; // Setcc.
|
||||||
def : WriteRes<WriteSETCCStore, [HWPort06,HWPort4,HWPort237]> {
|
def : WriteRes<WriteSETCCStore, [HWPort06,HWPort4,HWPort237]> {
|
||||||
let Latency = 2;
|
let Latency = 2;
|
||||||
|
|
|
@ -121,6 +121,7 @@ defm : SBWriteResPair<WriteJump, [SBPort5], 1>;
|
||||||
defm : SBWriteResPair<WriteCRC32, [SBPort1], 3, [1], 1, 5>;
|
defm : SBWriteResPair<WriteCRC32, [SBPort1], 3, [1], 1, 5>;
|
||||||
|
|
||||||
defm : SBWriteResPair<WriteCMOV, [SBPort05,SBPort015], 2, [1,1], 2>; // Conditional move.
|
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<WriteSETCC, [SBPort05]>; // Setcc.
|
||||||
def : WriteRes<WriteSETCCStore, [SBPort05,SBPort4,SBPort23]> {
|
def : WriteRes<WriteSETCCStore, [SBPort05,SBPort4,SBPort23]> {
|
||||||
let Latency = 2;
|
let Latency = 2;
|
||||||
|
@ -640,13 +641,6 @@ def SBWriteResGroup25_1 : SchedWriteRes<[SBPort23,SBPort015]> {
|
||||||
}
|
}
|
||||||
def: InstRW<[SBWriteResGroup25_1], (instrs LEAVE, LEAVE64)>;
|
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]> {
|
def SBWriteResGroup26 : SchedWriteRes<[SBPort05,SBPort015]> {
|
||||||
let Latency = 3;
|
let Latency = 3;
|
||||||
let NumMicroOps = 3;
|
let NumMicroOps = 3;
|
||||||
|
|
|
@ -124,6 +124,7 @@ def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, h
|
||||||
def : WriteRes<WriteLEA, [SKLPort15]>; // LEA instructions can't fold loads.
|
def : WriteRes<WriteLEA, [SKLPort15]>; // LEA instructions can't fold loads.
|
||||||
|
|
||||||
defm : SKLWriteResPair<WriteCMOV, [SKLPort06], 1>; // Conditional move.
|
defm : SKLWriteResPair<WriteCMOV, [SKLPort06], 1>; // Conditional move.
|
||||||
|
defm : X86WriteRes<WriteFCMOV, [SKLPort1], 3, [1], 1>; // x87 conditional move.
|
||||||
def : WriteRes<WriteSETCC, [SKLPort06]>; // Setcc.
|
def : WriteRes<WriteSETCC, [SKLPort06]>; // Setcc.
|
||||||
def : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> {
|
def : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> {
|
||||||
let Latency = 2;
|
let Latency = 2;
|
||||||
|
@ -704,8 +705,7 @@ def SKLWriteResGroup29 : SchedWriteRes<[SKLPort1]> {
|
||||||
let NumMicroOps = 1;
|
let NumMicroOps = 1;
|
||||||
let ResourceCycles = [1];
|
let ResourceCycles = [1];
|
||||||
}
|
}
|
||||||
def: InstRW<[SKLWriteResGroup29], (instregex "CMOV(N?)(B|BE|E|P)_F",
|
def: InstRW<[SKLWriteResGroup29], (instregex "PDEP(32|64)rr",
|
||||||
"PDEP(32|64)rr",
|
|
||||||
"PEXT(32|64)rr",
|
"PEXT(32|64)rr",
|
||||||
"SHLD(16|32|64)rri8",
|
"SHLD(16|32|64)rri8",
|
||||||
"SHRD(16|32|64)rri8")>;
|
"SHRD(16|32|64)rri8")>;
|
||||||
|
|
|
@ -124,6 +124,7 @@ def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, h
|
||||||
def : WriteRes<WriteLEA, [SKXPort15]>; // LEA instructions can't fold loads.
|
def : WriteRes<WriteLEA, [SKXPort15]>; // LEA instructions can't fold loads.
|
||||||
|
|
||||||
defm : SKXWriteResPair<WriteCMOV, [SKXPort06], 1>; // Conditional move.
|
defm : SKXWriteResPair<WriteCMOV, [SKXPort06], 1>; // Conditional move.
|
||||||
|
defm : X86WriteRes<WriteFCMOV, [SKXPort1], 3, [1], 1>; // x87 conditional move.
|
||||||
def : WriteRes<WriteSETCC, [SKXPort06]>; // Setcc.
|
def : WriteRes<WriteSETCC, [SKXPort06]>; // Setcc.
|
||||||
def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> {
|
def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> {
|
||||||
let Latency = 2;
|
let Latency = 2;
|
||||||
|
@ -754,8 +755,7 @@ def SKXWriteResGroup31 : SchedWriteRes<[SKXPort1]> {
|
||||||
let NumMicroOps = 1;
|
let NumMicroOps = 1;
|
||||||
let ResourceCycles = [1];
|
let ResourceCycles = [1];
|
||||||
}
|
}
|
||||||
def: InstRW<[SKXWriteResGroup31], (instregex "CMOV(N?)(B|BE|E|P)_F",
|
def: InstRW<[SKXWriteResGroup31], (instregex "PDEP(32|64)rr",
|
||||||
"PDEP(32|64)rr",
|
|
||||||
"PEXT(32|64)rr",
|
"PEXT(32|64)rr",
|
||||||
"SHLD(16|32|64)rri8",
|
"SHLD(16|32|64)rri8",
|
||||||
"SHRD(16|32|64)rri8")>;
|
"SHRD(16|32|64)rri8")>;
|
||||||
|
|
|
@ -117,6 +117,7 @@ defm WritePOPCNT : X86SchedWritePair; // Bit population count.
|
||||||
defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
|
defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
|
||||||
defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
|
defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
|
||||||
defm WriteCMOV : X86SchedWritePair; // Conditional move.
|
defm WriteCMOV : X86SchedWritePair; // Conditional move.
|
||||||
|
def WriteFCMOV : SchedWrite; // X87 conditional move.
|
||||||
def WriteSETCC : SchedWrite; // Set register based on condition code.
|
def WriteSETCC : SchedWrite; // Set register based on condition code.
|
||||||
def WriteSETCCStore : SchedWrite;
|
def WriteSETCCStore : SchedWrite;
|
||||||
|
|
||||||
|
|
|
@ -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<WriteCRC32, [AtomPort01], [AtomPort01]>; // NOTE: Doesn't exist on Atom.
|
||||||
|
|
||||||
defm : AtomWriteResPair<WriteCMOV, [AtomPort01], [AtomPort0]>;
|
defm : AtomWriteResPair<WriteCMOV, [AtomPort01], [AtomPort0]>;
|
||||||
|
defm : X86WriteRes<WriteFCMOV, [AtomPort01], 9, [9], 1>; // x87 conditional move.
|
||||||
|
|
||||||
def : WriteRes<WriteSETCC, [AtomPort01]>;
|
def : WriteRes<WriteSETCC, [AtomPort01]>;
|
||||||
def : WriteRes<WriteSETCCStore, [AtomPort01]> {
|
def : WriteRes<WriteSETCCStore, [AtomPort01]> {
|
||||||
|
@ -593,8 +594,7 @@ def : InstRW<[AtomWrite01_9], (instrs BT16mr, BT32mr, BT64mr,
|
||||||
SHLD64mri8, SHRD64mri8,
|
SHLD64mri8, SHRD64mri8,
|
||||||
SHLD64rri8, SHRD64rri8,
|
SHLD64rri8, SHRD64rri8,
|
||||||
CMPXCHG8rr)>;
|
CMPXCHG8rr)>;
|
||||||
def : InstRW<[AtomWrite01_9], (instregex "CMOV(B|BE|E|P|NB|NBE|NE|NP)_F",
|
def : InstRW<[AtomWrite01_9], (instregex "(U)?COM_FI", "TST_F",
|
||||||
"(U)?COM_FI", "TST_F",
|
|
||||||
"(U)?COMIS(D|S)rr",
|
"(U)?COMIS(D|S)rr",
|
||||||
"CVT(T)?SS2SI64rr(_Int)?")>;
|
"CVT(T)?SS2SI64rr(_Int)?")>;
|
||||||
|
|
||||||
|
|
|
@ -172,6 +172,7 @@ defm : JWriteResIntPair<WriteIDiv64, [JALU1, JDiv], 41, [1, 41], 2>;
|
||||||
defm : JWriteResIntPair<WriteCRC32, [JALU01], 3, [4], 3>;
|
defm : JWriteResIntPair<WriteCRC32, [JALU01], 3, [4], 3>;
|
||||||
|
|
||||||
defm : JWriteResIntPair<WriteCMOV, [JALU01], 1>; // Conditional move.
|
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<WriteSETCC, [JALU01]>; // Setcc.
|
||||||
def : WriteRes<WriteSETCCStore, [JALU01,JSAGU]>;
|
def : WriteRes<WriteSETCCStore, [JALU01,JSAGU]>;
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,7 @@ defm : SLMWriteResPair<WriteJump, [SLM_IEC_RSV1], 1>;
|
||||||
defm : SLMWriteResPair<WriteCRC32, [SLM_IEC_RSV1], 3>;
|
defm : SLMWriteResPair<WriteCRC32, [SLM_IEC_RSV1], 3>;
|
||||||
|
|
||||||
defm : SLMWriteResPair<WriteCMOV, [SLM_IEC_RSV01], 2, [2]>;
|
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<WriteSETCC, [SLM_IEC_RSV01]>;
|
||||||
def : WriteRes<WriteSETCCStore, [SLM_IEC_RSV01, SLM_MEC_RSV]> {
|
def : WriteRes<WriteSETCCStore, [SLM_IEC_RSV01, SLM_MEC_RSV]> {
|
||||||
// FIXME Latency and NumMicrOps?
|
// FIXME Latency and NumMicrOps?
|
||||||
|
|
|
@ -367,6 +367,7 @@ def ZnWriteMicrocoded : SchedWriteRes<[]> {
|
||||||
}
|
}
|
||||||
|
|
||||||
def : SchedAlias<WriteMicrocoded, ZnWriteMicrocoded>;
|
def : SchedAlias<WriteMicrocoded, ZnWriteMicrocoded>;
|
||||||
|
def : SchedAlias<WriteFCMOV, ZnWriteMicrocoded>;
|
||||||
def : SchedAlias<WriteSystem, ZnWriteMicrocoded>;
|
def : SchedAlias<WriteSystem, ZnWriteMicrocoded>;
|
||||||
def : SchedAlias<WriteMPSAD, ZnWriteMicrocoded>;
|
def : SchedAlias<WriteMPSAD, ZnWriteMicrocoded>;
|
||||||
def : SchedAlias<WriteMPSADY, ZnWriteMicrocoded>;
|
def : SchedAlias<WriteMPSADY, ZnWriteMicrocoded>;
|
||||||
|
@ -802,8 +803,6 @@ def : InstRW<[ZnWriteFPU3], (instregex "LD_F1")>;
|
||||||
// FLDPI FLDL2E etc.
|
// FLDPI FLDL2E etc.
|
||||||
def : InstRW<[ZnWriteFPU3], (instregex "FLDPI", "FLDL2(T|E)", "FLDL(G|N)2")>;
|
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.
|
// FNSTSW.
|
||||||
// AX.
|
// AX.
|
||||||
def : InstRW<[WriteMicrocoded], (instrs FNSTSW16r)>;
|
def : InstRW<[WriteMicrocoded], (instrs FNSTSW16r)>;
|
||||||
|
|
Loading…
Reference in New Issue