diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-09-27 16:24:42 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-09-27 16:24:42 +0000 |
| commit | 29cf499bca28e747e0e20b9c8834f896c9a20550 (patch) | |
| tree | 3dd1858a45e1e713db7ecdf5a3d0ab4e7411d9e1 /llvm/lib/Target | |
| parent | 06ccc9d998d326772ffa2ed8eae1c73e6e3d23f3 (diff) | |
| download | bcm5719-llvm-29cf499bca28e747e0e20b9c8834f896c9a20550.tar.gz bcm5719-llvm-29cf499bca28e747e0e20b9c8834f896c9a20550.zip | |
[X86] Split BT and BTC/BTR/BTS scheduler classes
llvm-svn: 343233
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 12 | ||||
| -rwxr-xr-x | llvm/lib/Target/X86/X86SchedBroadwell.td | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedHaswell.td | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedSandyBridge.td | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedSkylakeClient.td | 5 | ||||
| -rwxr-xr-x | llvm/lib/Target/X86/X86SchedSkylakeServer.td | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86Schedule.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleAtom.td | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBtVer2.td | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleSLM.td | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleZnver1.td | 11 |
11 files changed, 33 insertions, 28 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index 0af5a77073b..812d8595711 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -1818,7 +1818,7 @@ def BT64mi8 : RIi8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64i8imm:$src2), } // SchedRW let hasSideEffects = 0 in { -let SchedRW = [WriteBitTest], Constraints = "$src1 = $dst" in { +let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { def BTC16rr : I<0xBB, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2), "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB, NotMemoryFoldable; @@ -1842,7 +1842,7 @@ def BTC64mr : RI<0xBB, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), NotMemoryFoldable; } -let SchedRW = [WriteBitTest], Constraints = "$src1 = $dst" in { +let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { def BTC16ri8 : Ii8<0xBA, MRM7r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2), "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB; def BTC32ri8 : Ii8<0xBA, MRM7r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2), @@ -1861,7 +1861,7 @@ def BTC64mi8 : RIi8<0xBA, MRM7m, (outs), (ins i64mem:$src1, i64i8imm:$src2), Requires<[In64BitMode]>; } -let SchedRW = [WriteBitTest], Constraints = "$src1 = $dst" in { +let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { def BTR16rr : I<0xB3, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2), "btr{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB, NotMemoryFoldable; @@ -1885,7 +1885,7 @@ def BTR64mr : RI<0xB3, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), NotMemoryFoldable; } -let SchedRW = [WriteBitTest], Constraints = "$src1 = $dst" in { +let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { def BTR16ri8 : Ii8<0xBA, MRM6r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2), "btr{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB; @@ -1908,7 +1908,7 @@ def BTR64mi8 : RIi8<0xBA, MRM6m, (outs), (ins i64mem:$src1, i64i8imm:$src2), Requires<[In64BitMode]>; } -let SchedRW = [WriteBitTest], Constraints = "$src1 = $dst" in { +let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { def BTS16rr : I<0xAB, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2), "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB, NotMemoryFoldable; @@ -1932,7 +1932,7 @@ def BTS64mr : RI<0xAB, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), NotMemoryFoldable; } -let SchedRW = [WriteBitTest], Constraints = "$src1 = $dst" in { +let SchedRW = [WriteBitTestSet], Constraints = "$src1 = $dst" in { def BTS16ri8 : Ii8<0xBA, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2), "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize16, TB; def BTS32ri8 : Ii8<0xBA, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2), diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index a1624b0c968..c1c4ba258a3 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -161,8 +161,9 @@ 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<WriteLAHFSAHF, [BWPort06]>; +def : WriteRes<WriteBitTest, [BWPort06]>; // Bit Test instrs +def : WriteRes<WriteBitTestSet, [BWPort06]>; // 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 87f79198edb..0fcc5e9c104 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -165,8 +165,9 @@ def : WriteRes<WriteSETCCStore, [HWPort06,HWPort4,HWPort237]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [HWPort06]>; -def : WriteRes<WriteBitTest,[HWPort06]>; +def : WriteRes<WriteLAHFSAHF, [HWPort06]>; +def : WriteRes<WriteBitTest, [HWPort06]>; +def : WriteRes<WriteBitTestSet, [HWPort06]>; // 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 e01170a6b17..e2f3067d1e8 100644 --- a/llvm/lib/Target/X86/X86SchedSandyBridge.td +++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td @@ -160,8 +160,9 @@ def : WriteRes<WriteSETCCStore, [SBPort05,SBPort4,SBPort23]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [SBPort05]>; -def : WriteRes<WriteBitTest,[SBPort05]>; +def : WriteRes<WriteLAHFSAHF, [SBPort05]>; +def : WriteRes<WriteBitTest, [SBPort05]>; +def : WriteRes<WriteBitTestSet, [SBPort05]>; // 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 b0fc3a2eaf3..dbe7c056ba5 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -158,8 +158,9 @@ def : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [SKLPort06]>; -def : WriteRes<WriteBitTest,[SKLPort06]>; // +def : WriteRes<WriteLAHFSAHF, [SKLPort06]>; +def : WriteRes<WriteBitTest, [SKLPort06]>; +def : WriteRes<WriteBitTestSet, [SKLPort06]>; // Bit counts. defm : SKLWriteResPair<WriteBSF, [SKLPort1], 3>; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index d34d790ce6d..4d25dd3e504 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -159,8 +159,9 @@ def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> { let Latency = 2; let NumMicroOps = 3; } -def : WriteRes<WriteLAHFSAHF, [SKXPort06]>; -def : WriteRes<WriteBitTest, [SKXPort06]>; // +def : WriteRes<WriteLAHFSAHF, [SKXPort06]>; +def : WriteRes<WriteBitTest, [SKXPort06]>; +def : WriteRes<WriteBitTestSet, [SKXPort06]>; // 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 538ba467c66..e6bbf177509 100644 --- a/llvm/lib/Target/X86/X86Schedule.td +++ b/llvm/lib/Target/X86/X86Schedule.td @@ -156,6 +156,7 @@ 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 WriteBitTestSet : SchedWrite; // Bit Test + Set - TODO add memory folding support // Integer shifts and rotates. defm WriteShift : X86SchedWritePair; diff --git a/llvm/lib/Target/X86/X86ScheduleAtom.td b/llvm/lib/Target/X86/X86ScheduleAtom.td index e175d6f5840..6063d1a1582 100644 --- a/llvm/lib/Target/X86/X86ScheduleAtom.td +++ b/llvm/lib/Target/X86/X86ScheduleAtom.td @@ -121,7 +121,8 @@ def : WriteRes<WriteLAHFSAHF, [AtomPort01]> { let Latency = 2; let ResourceCycles = [2]; } -def : WriteRes<WriteBitTest,[AtomPort01]>; +defm : X86WriteRes<WriteBitTest, [AtomPort01], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestSet, [AtomPort01], 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 83ba18f9b4a..64fbbb05ab6 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -200,7 +200,9 @@ defm : X86WriteRes<WriteFCMOV, [JFPU0, JFPA], 3, [1,1], 1>; // x87 conditional m def : WriteRes<WriteSETCC, [JALU01]>; // Setcc. def : WriteRes<WriteSETCCStore, [JALU01,JSAGU]>; def : WriteRes<WriteLAHFSAHF, [JALU01]>; -def : WriteRes<WriteBitTest,[JALU01]>; + +defm : X86WriteRes<WriteBitTest, [JALU01], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestSet, [JALU01], 1, [1], 1>; // 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 18200f78e89..a41b18bb64c 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -134,8 +134,9 @@ 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<WriteLAHFSAHF, [SLM_IEC_RSV01]>; +def : WriteRes<WriteBitTest, [SLM_IEC_RSV01]>; +def : WriteRes<WriteBitTestSet, [SLM_IEC_RSV01]>; // 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 f3d2aa1fb0d..11ecd9a560d 100644 --- a/llvm/lib/Target/X86/X86ScheduleZnver1.td +++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td @@ -213,7 +213,9 @@ defm : ZnWriteResPair<WriteCMOV2, [ZnALU], 1>; def : WriteRes<WriteSETCC, [ZnALU]>; def : WriteRes<WriteSETCCStore, [ZnALU, ZnAGU]>; defm : X86WriteRes<WriteLAHFSAHF, [ZnALU], 2, [1], 2>; -def : WriteRes<WriteBitTest,[ZnALU]>; + +defm : X86WriteRes<WriteBitTest, [ZnALU], 1, [1], 1>; +defm : X86WriteRes<WriteBitTestSet, [ZnALU], 2, [1], 2>; // Bit counts. defm : ZnWriteResPair<WriteBSF, [ZnALU], 3>; @@ -715,13 +717,6 @@ def ZnWriteALULat2Ld : SchedWriteRes<[ZnAGU, ZnALU]> { def : InstRW<[WriteShiftLd], (instregex "BT(16|32|64)mi8")>; // BTR BTS BTC. -// r,r,i. -def ZnWriteBTRSC : SchedWriteRes<[ZnALU]> { - let Latency = 2; - let NumMicroOps = 2; -} -def : InstRW<[ZnWriteBTRSC], (instregex "BT(R|S|C)(16|32|64)r(r|i8)")>; - // m,r,i. def ZnWriteBTRSCm : SchedWriteRes<[ZnAGU, ZnALU]> { let Latency = 6; |

