diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-09-14 13:09:56 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-09-14 13:09:56 +0000 |
commit | 6a47cdbdecc8dae9c69135daa372248370db7116 (patch) | |
tree | 9478cf8f98215dec09bc1853e56e4ccd36ead8d4 /llvm/lib/Target | |
parent | 48c0688a36b06950f681cbf4c0f79e16e5c4a403 (diff) | |
download | bcm5719-llvm-6a47cdbdecc8dae9c69135daa372248370db7116.tar.gz bcm5719-llvm-6a47cdbdecc8dae9c69135daa372248370db7116.zip |
[X86][BMI1] Add scheduler class for BLSI/BLSMSK/BLSR BMI1 instructions
llvm-svn: 342234
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 4 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedBroadwell.td | 13 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedHaswell.td | 13 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSandyBridge.td | 5 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86SchedSkylakeClient.td | 13 | ||||
-rwxr-xr-x | llvm/lib/Target/X86/X86SchedSkylakeServer.td | 13 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86Schedule.td | 4 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleAtom.td | 3 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBtVer2.td | 3 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleSLM.td | 3 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleZnver1.td | 9 |
11 files changed, 35 insertions, 48 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index b401b6b879e..0af5a77073b 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -2368,11 +2368,11 @@ multiclass bmi_bls<string mnemonic, Format RegMRM, Format MemMRM, let hasSideEffects = 0 in { def rr : I<0xF3, RegMRM, (outs RC:$dst), (ins RC:$src), !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>, - T8PS, VEX_4V, Sched<[WriteALU]>; + T8PS, VEX_4V, Sched<[WriteBLS]>; let mayLoad = 1 in def rm : I<0xF3, MemMRM, (outs RC:$dst), (ins x86memop:$src), !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>, - T8PS, VEX_4V, Sched<[WriteALULd]>; + T8PS, VEX_4V, Sched<[WriteBLS.Folded]>; } } diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index ad4a10a2e15..395923f49d6 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -158,9 +158,10 @@ defm : X86WriteRes<WriteSHDrrcl,[BWPort1,BWPort06,BWPort0156], 6, [1, 1, 2], 4>; defm : X86WriteRes<WriteSHDmri, [BWPort1,BWPort23,BWPort237,BWPort0156], 9, [1, 1, 1, 1], 4>; defm : X86WriteRes<WriteSHDmrcl,[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156], 11, [1, 1, 1, 1, 2], 6>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>; -defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>; +defm : BWWriteResPair<WriteBLS, [BWPort15], 1>; +defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>; // Loads, stores, and moves, not folded with other operations. defm : X86WriteRes<WriteLoad, [BWPort23], 5, [1], 1>; @@ -613,10 +614,7 @@ def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr", - "BLSI(32|64)rr", - "BLSMSK(32|64)rr", - "BLSR(32|64)rr")>; +def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr")>; def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> { let Latency = 1; @@ -1005,9 +1003,6 @@ def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> { let ResourceCycles = [1,1]; } def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm", - "BLSI(32|64)rm", - "BLSMSK(32|64)rm", - "BLSR(32|64)rm", "MOVBE(16|32|64)rm")>; def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> { diff --git a/llvm/lib/Target/X86/X86SchedHaswell.td b/llvm/lib/Target/X86/X86SchedHaswell.td index 916bb309d32..85d74961299 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -167,9 +167,10 @@ defm : HWWriteResPair<WriteLZCNT, [HWPort1], 3>; defm : HWWriteResPair<WriteTZCNT, [HWPort1], 3>; defm : HWWriteResPair<WritePOPCNT, [HWPort1], 3>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : HWWriteResPair<WriteBEXTR, [HWPort06,HWPort15], 2, [1,1], 2>; -defm : HWWriteResPair<WriteBZHI, [HWPort15], 1>; +defm : HWWriteResPair<WriteBLS, [HWPort15], 1>; +defm : HWWriteResPair<WriteBZHI, [HWPort15], 1>; defm : HWWriteResPair<WriteDiv8, [HWPort0, HWDivider], 25, [1,10], 1, 4>; defm : HWWriteResPair<WriteDiv16, [HWPort0, HWDivider], 25, [1,10], 1, 4>; @@ -901,10 +902,7 @@ def HWWriteResGroup8 : SchedWriteRes<[HWPort15]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[HWWriteResGroup8], (instregex "ANDN(32|64)rr", - "BLSI(32|64)rr", - "BLSMSK(32|64)rr", - "BLSR(32|64)rr")>; +def: InstRW<[HWWriteResGroup8], (instregex "ANDN(32|64)rr")>; def HWWriteResGroup9 : SchedWriteRes<[HWPort015]> { let Latency = 1; @@ -1012,9 +1010,6 @@ def HWWriteResGroup16 : SchedWriteRes<[HWPort23,HWPort15]> { let ResourceCycles = [1,1]; } def: InstRW<[HWWriteResGroup16], (instregex "ANDN(32|64)rm", - "BLSI(32|64)rm", - "BLSMSK(32|64)rm", - "BLSR(32|64)rm", "MOVBE(16|32|64)rm")>; def HWWriteResGroup17 : SchedWriteRes<[HWPort23,HWPort015]> { diff --git a/llvm/lib/Target/X86/X86SchedSandyBridge.td b/llvm/lib/Target/X86/X86SchedSandyBridge.td index 4585110711f..bdbb410d9a8 100644 --- a/llvm/lib/Target/X86/X86SchedSandyBridge.td +++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td @@ -162,10 +162,11 @@ defm : SBWriteResPair<WriteLZCNT, [SBPort1], 3, [1], 1, 5>; defm : SBWriteResPair<WriteTZCNT, [SBPort1], 3, [1], 1, 5>; defm : SBWriteResPair<WritePOPCNT, [SBPort1], 3, [1], 1, 6>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI // NOTE: These don't exist on Sandy Bridge. Ports are guesses. defm : SBWriteResPair<WriteBEXTR, [SBPort05,SBPort1], 2, [1,1], 2>; -defm : SBWriteResPair<WriteBZHI, [SBPort1], 1>; +defm : SBWriteResPair<WriteBLS, [SBPort015], 1>; +defm : SBWriteResPair<WriteBZHI, [SBPort1], 1>; // Scalar and vector floating point. defm : X86WriteRes<WriteFLD0, [SBPort5], 1, [1], 1>; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeClient.td b/llvm/lib/Target/X86/X86SchedSkylakeClient.td index 04ec9c4a220..0a9c0e4a0d4 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -157,9 +157,10 @@ defm : X86WriteRes<WriteSHDrrcl,[SKLPort1,SKLPort06,SKLPort0156], 6, [1, 2, 1], defm : X86WriteRes<WriteSHDmri, [SKLPort1,SKLPort23,SKLPort237,SKLPort0156], 9, [1, 1, 1, 1], 4>; defm : X86WriteRes<WriteSHDmrcl,[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort0156], 11, [1, 1, 1, 2, 1], 6>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : SKLWriteResPair<WriteBEXTR, [SKLPort06,SKLPort15], 2, [1,1], 2>; -defm : SKLWriteResPair<WriteBZHI, [SKLPort15], 1>; +defm : SKLWriteResPair<WriteBLS, [SKLPort15], 1>; +defm : SKLWriteResPair<WriteBZHI, [SKLPort15], 1>; // Loads, stores, and moves, not folded with other operations. defm : X86WriteRes<WriteLoad, [SKLPort23], 5, [1], 1>; @@ -615,10 +616,7 @@ def SKLWriteResGroup8 : SchedWriteRes<[SKLPort15]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKLWriteResGroup8], (instregex "ANDN(32|64)rr", - "BLSI(32|64)rr", - "BLSMSK(32|64)rr", - "BLSR(32|64)rr")>; +def: InstRW<[SKLWriteResGroup8], (instregex "ANDN(32|64)rr")>; def SKLWriteResGroup9 : SchedWriteRes<[SKLPort015]> { let Latency = 1; @@ -1047,9 +1045,6 @@ def SKLWriteResGroup75 : SchedWriteRes<[SKLPort23,SKLPort15]> { let ResourceCycles = [1,1]; } def: InstRW<[SKLWriteResGroup75], (instregex "ANDN(32|64)rm", - "BLSI(32|64)rm", - "BLSMSK(32|64)rm", - "BLSR(32|64)rm", "MOVBE(16|32|64)rm")>; def SKLWriteResGroup76 : SchedWriteRes<[SKLPort23,SKLPort0156]> { diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index 3221709f9a9..227e3350d61 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -157,9 +157,10 @@ defm : SKXWriteResPair<WriteLZCNT, [SKXPort1], 3>; defm : SKXWriteResPair<WriteTZCNT, [SKXPort1], 3>; defm : SKXWriteResPair<WritePOPCNT, [SKXPort1], 3>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : SKXWriteResPair<WriteBEXTR, [SKXPort06,SKXPort15], 2, [1,1], 2>; -defm : SKXWriteResPair<WriteBZHI, [SKXPort15], 1>; +defm : SKXWriteResPair<WriteBLS, [SKXPort15], 1>; +defm : SKXWriteResPair<WriteBZHI, [SKXPort15], 1>; // Loads, stores, and moves, not folded with other operations. defm : X86WriteRes<WriteLoad, [SKXPort23], 5, [1], 1>; @@ -628,10 +629,7 @@ def SKXWriteResGroup8 : SchedWriteRes<[SKXPort15]> { let NumMicroOps = 1; let ResourceCycles = [1]; } -def: InstRW<[SKXWriteResGroup8], (instregex "ANDN(32|64)rr", - "BLSI(32|64)rr", - "BLSMSK(32|64)rr", - "BLSR(32|64)rr")>; +def: InstRW<[SKXWriteResGroup8], (instregex "ANDN(32|64)rr")>; def SKXWriteResGroup9 : SchedWriteRes<[SKXPort015]> { let Latency = 1; @@ -1207,9 +1205,6 @@ def SKXWriteResGroup79 : SchedWriteRes<[SKXPort23,SKXPort15]> { let ResourceCycles = [1,1]; } def: InstRW<[SKXWriteResGroup79], (instregex "ANDN(32|64)rm", - "BLSI(32|64)rm", - "BLSMSK(32|64)rm", - "BLSR(32|64)rm", "MOVBE(16|32|64)rm")>; def SKXWriteResGroup80 : SchedWriteRes<[SKXPort23,SKXPort015]> { diff --git a/llvm/lib/Target/X86/X86Schedule.td b/llvm/lib/Target/X86/X86Schedule.td index 20fa4bd03ef..6b9970e1736 100644 --- a/llvm/lib/Target/X86/X86Schedule.td +++ b/llvm/lib/Target/X86/X86Schedule.td @@ -149,14 +149,16 @@ def WriteBitTest : SchedWrite; // Bit Test - TODO add memory folding support // Integer shifts and rotates. defm WriteShift : X86SchedWritePair; + // Double shift instructions. def WriteSHDrri : SchedWrite; def WriteSHDrrcl : SchedWrite; def WriteSHDmri : SchedWrite; def WriteSHDmrcl : SchedWrite; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm WriteBEXTR : X86SchedWritePair; +defm WriteBLS : X86SchedWritePair; defm WriteBZHI : X86SchedWritePair; // Idioms that clear a register, like xorps %xmm0, %xmm0. diff --git a/llvm/lib/Target/X86/X86ScheduleAtom.td b/llvm/lib/Target/X86/X86ScheduleAtom.td index 5c37a1589a7..42766e6639e 100644 --- a/llvm/lib/Target/X86/X86ScheduleAtom.td +++ b/llvm/lib/Target/X86/X86ScheduleAtom.td @@ -144,8 +144,9 @@ defm : X86WriteResPairUnsupported<WritePOPCNT>; defm : X86WriteResPairUnsupported<WriteLZCNT>; defm : X86WriteResPairUnsupported<WriteTZCNT>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : X86WriteResPairUnsupported<WriteBEXTR>; +defm : X86WriteResPairUnsupported<WriteBLS>; defm : X86WriteResPairUnsupported<WriteBZHI>; //////////////////////////////////////////////////////////////////////////////// diff --git a/llvm/lib/Target/X86/X86ScheduleBtVer2.td b/llvm/lib/Target/X86/X86ScheduleBtVer2.td index 84780a4a20e..5948b1fc610 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -203,8 +203,9 @@ defm : JWriteResIntPair<WritePOPCNT, [JALU01], 1>; defm : JWriteResIntPair<WriteLZCNT, [JALU01], 1>; defm : JWriteResIntPair<WriteTZCNT, [JALU01], 2, [2]>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : JWriteResIntPair<WriteBEXTR, [JALU01], 1>; +defm : JWriteResIntPair<WriteBLS, [JALU01], 1>; defm : X86WriteResPairUnsupported<WriteBZHI>; //////////////////////////////////////////////////////////////////////////////// diff --git a/llvm/lib/Target/X86/X86ScheduleSLM.td b/llvm/lib/Target/X86/X86ScheduleSLM.td index cfede8c7359..f03b575255e 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -137,8 +137,9 @@ defm : SLMWriteResPair<WriteLZCNT, [SLM_IEC_RSV0], 3>; defm : SLMWriteResPair<WriteTZCNT, [SLM_IEC_RSV0], 3>; defm : SLMWriteResPair<WritePOPCNT, [SLM_IEC_RSV0], 3>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : X86WriteResPairUnsupported<WriteBEXTR>; +defm : X86WriteResPairUnsupported<WriteBLS>; defm : X86WriteResPairUnsupported<WriteBZHI>; defm : SLMWriteResPair<WriteDiv8, [SLM_IEC_RSV01, SLMDivider], 25, [1,25], 1, 4>; diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td index 076e37359cf..9899c2660aa 100644 --- a/llvm/lib/Target/X86/X86ScheduleZnver1.td +++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td @@ -213,9 +213,10 @@ defm : ZnWriteResPair<WritePOPCNT, [ZnALU], 1>; // Treat misc copies as a move. def : InstRW<[WriteMove], (instrs COPY)>; -// BMI1 BEXTR, BMI2 BZHI +// BMI1 BEXTR/BLS, BMI2 BZHI defm : ZnWriteResPair<WriteBEXTR, [ZnALU], 1>; -defm : ZnWriteResPair<WriteBZHI, [ZnALU], 1>; +//defm : ZnWriteResPair<WriteBLS, [ZnALU], 2>; +defm : ZnWriteResPair<WriteBZHI, [ZnALU], 1>; // IDIV defm : ZnWriteResPair<WriteDiv8, [ZnALU2, ZnDivider], 15, [1,15], 1>; @@ -713,9 +714,9 @@ def : InstRW<[ZnWriteBTRSCm], (instregex "BT(R|S|C)(16|32|64)m(r|i8)")>; // BLSI BLSMSK BLSR. // r,r. -def : InstRW<[ZnWriteALULat2], (instregex "BLS(I|MSK|R)(32|64)rr")>; +def : SchedAlias<WriteBLS, ZnWriteALULat2>; // r,m. -def : InstRW<[ZnWriteALULat2Ld], (instregex "BLS(I|MSK|R)(32|64)rm")>; +def : SchedAlias<WriteBLSLd, ZnWriteALULat2Ld>; // CLD STD. def : InstRW<[WriteALU], (instrs STD, CLD)>; |