diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-01 14:23:37 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-01 14:23:37 +0000 |
commit | 17d8982b915802caba0db974261444b5138e0fa6 (patch) | |
tree | 79e7e3f3d9d7d99eae19b9643b15bf5f5a93e6b9 /llvm | |
parent | 0d2b1b7eedc83bf416eb6c2954d0b1f80b1ba7fd (diff) |
[X86] Create schedule classes for BTmi and BTmr instructions
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 4 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedBroadwell.td | 9 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedHaswell.td | 9 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSandyBridge.td | 9 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSkylakeClient.td | 9 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedSkylakeServer.td | 8 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86Schedule.td | 6 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleAtom.td | 6 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBtVer2.td | 6 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleSLM.td | 8 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleZnver1.td | 6 |
11 files changed, 53 insertions, 27 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index 3919bcc5627..673d95b0367 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -1771,7 +1771,7 @@ def BT64rr : RI<0xA3, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2), // only for now. These instructions are also slow on modern CPUs so that's // another reason to avoid generating them. -let mayLoad = 1, hasSideEffects = 0, SchedRW = [WriteALULd] in { +let mayLoad = 1, hasSideEffects = 0, SchedRW = [WriteBitTestRegLd] in { def BT16mr : I<0xA3, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2), "bt{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB, NotMemoryFoldable; @@ -1799,7 +1799,7 @@ def BT64ri8 : RIi8<0xBA, MRM4r, (outs), (ins GR64:$src1, i64i8imm:$src2), // Note that these instructions aren't slow because that only applies when the // other operand is in a register. When it's an immediate, bt is still fast. -let SchedRW = [WriteALULd] in { +let SchedRW = [WriteBitTestImmLd] in { def BT16mi8 : Ii8<0xBA, MRM4m, (outs), (ins i16mem:$src1, i16i8imm:$src2), "bt{w}\t{$src2, $src1|$src1, $src2}", [(set EFLAGS, (X86bt (loadi16 addr:$src1), diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index 2a98f984ed1..208daf220ce 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -161,9 +161,12 @@ def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [BWPort06]>; -def : WriteRes<WriteBitTest, [BWPort06]>; // Bit Test instrs -def : WriteRes<WriteBitTestSet, [BWPort06]>; // Bit Test + Set instrs + +defm : X86WriteRes<WriteLAHFSAHF, [BWPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTest, [BWPort06], 1, [1], 1>; // Bit Test instrs +defm : X86WriteRes<WriteBitTestImmLd, [BWPort06,BWPort23], 6, [1,1], 2>; +defm : X86WriteRes<WriteBitTestRegLd, [BWPort0156,BWPort23], 6, [1,1], 2>; +defm : X86WriteRes<WriteBitTestSet, [BWPort06], 1, [1], 1>; // Bit Test + Set instrs // Bit counts. defm : BWWriteResPair<WriteBSF, [BWPort1], 3>; diff --git a/llvm/lib/Target/X86/X86SchedHaswell.td b/llvm/lib/Target/X86/X86SchedHaswell.td index d1449ba0a0a..fb7db01c9dd 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -165,9 +165,12 @@ def : WriteRes<WriteSETCCStore, [HWPort06,HWPort4,HWPort237]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [HWPort06]>; -def : WriteRes<WriteBitTest, [HWPort06]>; -def : WriteRes<WriteBitTestSet, [HWPort06]>; + +defm : X86WriteRes<WriteLAHFSAHF, [HWPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTest, [HWPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [HWPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestRegLd, [HWPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestSet, [HWPort06], 1, [1], 1>; // This is for simple LEAs with one or two input operands. // The complex ones can only execute on port 1, and they require two cycles on diff --git a/llvm/lib/Target/X86/X86SchedSandyBridge.td b/llvm/lib/Target/X86/X86SchedSandyBridge.td index 3196f2a8f12..67840fa7371 100644 --- a/llvm/lib/Target/X86/X86SchedSandyBridge.td +++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td @@ -160,9 +160,12 @@ def : WriteRes<WriteSETCCStore, [SBPort05,SBPort4,SBPort23]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [SBPort05]>; -def : WriteRes<WriteBitTest, [SBPort05]>; -def : WriteRes<WriteBitTestSet, [SBPort05]>; + +defm : X86WriteRes<WriteLAHFSAHF, [SBPort05], 1, [1], 1>; +defm : X86WriteRes<WriteBitTest, [SBPort05], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [SBPort05], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestRegLd, [SBPort05], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestSet, [SBPort05], 1, [1], 1>; // This is for simple LEAs with one or two input operands. // The complex ones can only execute on port 1, and they require two cycles on diff --git a/llvm/lib/Target/X86/X86SchedSkylakeClient.td b/llvm/lib/Target/X86/X86SchedSkylakeClient.td index dbe7c056ba5..8d71792db36 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -158,9 +158,12 @@ def : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [SKLPort06]>; -def : WriteRes<WriteBitTest, [SKLPort06]>; -def : WriteRes<WriteBitTestSet, [SKLPort06]>; + +defm : X86WriteRes<WriteLAHFSAHF, [SKLPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTest, [SKLPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [SKLPort06,SKLPort23], 6, [1,1], 2>; +defm : X86WriteRes<WriteBitTestRegLd, [SKLPort0156,SKLPort23], 6, [1,1], 2>; +defm : X86WriteRes<WriteBitTestSet, [SKLPort06], 1, [1], 1>; // Bit counts. defm : SKLWriteResPair<WriteBSF, [SKLPort1], 3>; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index 6c597f9db3c..39a7b08c7f3 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -159,9 +159,11 @@ def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [SKXPort06]>; -def : WriteRes<WriteBitTest, [SKXPort06]>; -def : WriteRes<WriteBitTestSet, [SKXPort06]>; +defm : X86WriteRes<WriteLAHFSAHF, [SKXPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTest, [SKXPort06], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [SKXPort06,SKXPort23], 6, [1,1], 2>; +defm : X86WriteRes<WriteBitTestRegLd, [SKXPort0156,SKXPort23], 6, [1,1], 2>; +defm : X86WriteRes<WriteBitTestSet, [SKXPort06], 1, [1], 1>; // Integer shifts and rotates. defm : SKXWriteResPair<WriteShift, [SKXPort06], 1>; diff --git a/llvm/lib/Target/X86/X86Schedule.td b/llvm/lib/Target/X86/X86Schedule.td index e6bbf177509..cf6ffc31b37 100644 --- a/llvm/lib/Target/X86/X86Schedule.td +++ b/llvm/lib/Target/X86/X86Schedule.td @@ -155,7 +155,11 @@ def WriteFCMOV : SchedWrite; // X87 conditional move. def WriteSETCC : SchedWrite; // Set register based on condition code. def WriteSETCCStore : SchedWrite; def WriteLAHFSAHF : SchedWrite; // Load/Store flags in AH. -def WriteBitTest : SchedWrite; // Bit Test - TODO add memory folding support + +def WriteBitTest : SchedWrite; // Bit Test +def WriteBitTestImmLd : SchedWrite; +def WriteBitTestRegLd : SchedWrite; + def WriteBitTestSet : SchedWrite; // Bit Test + Set - TODO add memory folding support // Integer shifts and rotates. diff --git a/llvm/lib/Target/X86/X86ScheduleAtom.td b/llvm/lib/Target/X86/X86ScheduleAtom.td index 22a18fe8cfb..949a13bb56f 100644 --- a/llvm/lib/Target/X86/X86ScheduleAtom.td +++ b/llvm/lib/Target/X86/X86ScheduleAtom.td @@ -121,8 +121,10 @@ def : WriteRes<WriteLAHFSAHF, [AtomPort01]> { let Latency = 2; let ResourceCycles = [2]; } -defm : X86WriteRes<WriteBitTest, [AtomPort1], 1, [1], 1>; -defm : X86WriteRes<WriteBitTestSet, [AtomPort1], 1, [1], 1>; +defm : X86WriteRes<WriteBitTest, [AtomPort1], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [AtomPort0], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestRegLd, [AtomPort0], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestSet, [AtomPort1], 1, [1], 1>; // This is for simple LEAs with one or two input operands. def : WriteRes<WriteLEA, [AtomPort1]>; diff --git a/llvm/lib/Target/X86/X86ScheduleBtVer2.td b/llvm/lib/Target/X86/X86ScheduleBtVer2.td index 6220ebe04d5..8f79281a3d6 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -204,8 +204,10 @@ def : WriteRes<WriteSETCC, [JALU01]>; // Setcc. def : WriteRes<WriteSETCCStore, [JALU01,JSAGU]>; def : WriteRes<WriteLAHFSAHF, [JALU01]>; -defm : X86WriteRes<WriteBitTest, [JALU01], 1, [1], 1>; -defm : X86WriteRes<WriteBitTestSet, [JALU01], 1, [1], 2>; +defm : X86WriteRes<WriteBitTest, [JALU01], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [JALU01, JLAGU], 4, [1, 1], 1>; +defm : X86WriteRes<WriteBitTestRegLd, [JALU01, JLAGU], 4, [1, 1], 1>; +defm : X86WriteRes<WriteBitTestSet, [JALU01], 1, [1], 2>; // This is for simple LEAs with one or two input operands. def : WriteRes<WriteLEA, [JALU01]>; diff --git a/llvm/lib/Target/X86/X86ScheduleSLM.td b/llvm/lib/Target/X86/X86ScheduleSLM.td index a41b18bb64c..372cc863ce1 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -134,9 +134,11 @@ def : WriteRes<WriteSETCCStore, [SLM_IEC_RSV01, SLM_MEC_RSV]> { // FIXME Latency and NumMicrOps? let ResourceCycles = [2,1]; } -def : WriteRes<WriteLAHFSAHF, [SLM_IEC_RSV01]>; -def : WriteRes<WriteBitTest, [SLM_IEC_RSV01]>; -def : WriteRes<WriteBitTestSet, [SLM_IEC_RSV01]>; +defm : X86WriteRes<WriteLAHFSAHF, [SLM_IEC_RSV01], 1, [1], 1>; +defm : X86WriteRes<WriteBitTest, [SLM_IEC_RSV01], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [SLM_IEC_RSV01, SLM_MEC_RSV], 4, [1,1], 1>; +defm : X86WriteRes<WriteBitTestRegLd, [SLM_IEC_RSV01, SLM_MEC_RSV], 4, [1,1], 1>; +defm : X86WriteRes<WriteBitTestSet, [SLM_IEC_RSV01], 1, [1], 1>; // This is for simple LEAs with one or two input operands. // The complex ones can only execute on port 1, and they require two cycles on diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td index 11ecd9a560d..7d34fd9f7c7 100644 --- a/llvm/lib/Target/X86/X86ScheduleZnver1.td +++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td @@ -214,8 +214,10 @@ def : WriteRes<WriteSETCC, [ZnALU]>; def : WriteRes<WriteSETCCStore, [ZnALU, ZnAGU]>; defm : X86WriteRes<WriteLAHFSAHF, [ZnALU], 2, [1], 2>; -defm : X86WriteRes<WriteBitTest, [ZnALU], 1, [1], 1>; -defm : X86WriteRes<WriteBitTestSet, [ZnALU], 2, [1], 2>; +defm : X86WriteRes<WriteBitTest, [ZnALU], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestImmLd, [ZnALU,ZnAGU], 5, [1,1], 2>; +defm : X86WriteRes<WriteBitTestRegLd, [ZnALU,ZnAGU], 5, [1,1], 2>; +defm : X86WriteRes<WriteBitTestSet, [ZnALU], 2, [1], 2>; // Bit counts. defm : ZnWriteResPair<WriteBSF, [ZnALU], 3>; |