diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 4 | ||||
| -rwxr-xr-x | llvm/lib/Target/X86/X86SchedBroadwell.td | 10 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedHaswell.td | 10 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedSandyBridge.td | 10 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86SchedSkylakeClient.td | 10 | ||||
| -rwxr-xr-x | llvm/lib/Target/X86/X86SchedSkylakeServer.td | 10 | ||||
| -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 | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleSLM.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ScheduleZnver1.td | 11 |
11 files changed, 14 insertions, 57 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index bc7afd32d49..b1ef2c565a5 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -1994,7 +1994,7 @@ multiclass ATOMIC_SWAP<bits<8> opc8, bits<8> opc, string mnemonic, string frag> defm XCHG : ATOMIC_SWAP<0x86, 0x87, "xchg", "atomic_swap">, NotMemoryFoldable; // Swap between registers. -let SchedRW = [WriteALU] in { +let SchedRW = [WriteXCHG] in { let Constraints = "$src1 = $dst1, $src2 = $dst2", hasSideEffects = 0 in { def XCHG8rr : I<0x86, MRMSrcReg, (outs GR8:$dst1, GR8:$dst2), (ins GR8:$src1, GR8:$src2), @@ -2027,7 +2027,7 @@ def XCHG64ar : RI<0x90, AddRegFrm, (outs GR64:$dst), (ins GR64:$src), } // SchedRW let hasSideEffects = 0, Constraints = "$src1 = $dst1, $src2 = $dst2", - Defs = [EFLAGS], SchedRW = [WriteALU] in { + Defs = [EFLAGS], SchedRW = [WriteXCHG] in { def XADD8rr : I<0xC0, MRMDestReg, (outs GR8:$dst1, GR8:$dst2), (ins GR8:$src1, GR8:$src2), "xadd{b}\t{$src2, $src1|$src1, $src2}", []>, TB; diff --git a/llvm/lib/Target/X86/X86SchedBroadwell.td b/llvm/lib/Target/X86/X86SchedBroadwell.td index 6334d9e89a6..510037ac9f7 100755 --- a/llvm/lib/Target/X86/X86SchedBroadwell.td +++ b/llvm/lib/Target/X86/X86SchedBroadwell.td @@ -121,6 +121,7 @@ defm : BWWriteResPair<WriteIDiv64, [BWPort0, BWDivider], 25, [1, 10]>; defm : X86WriteRes<WriteBSWAP32, [BWPort15], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [BWPort06, BWPort15], 2, [1, 1], 2>; +defm : X86WriteRes<WriteXCHG, [BWPort0156], 2, [3], 3>; defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>; def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part. @@ -759,15 +760,6 @@ def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> { def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr", "VPBROADCASTWrr")>; -def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> { - let Latency = 2; - let NumMicroOps = 3; - let ResourceCycles = [3]; -} -def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; - def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> { let Latency = 3; let NumMicroOps = 3; diff --git a/llvm/lib/Target/X86/X86SchedHaswell.td b/llvm/lib/Target/X86/X86SchedHaswell.td index 876c3e4162c..b8d9e5f921c 100644 --- a/llvm/lib/Target/X86/X86SchedHaswell.td +++ b/llvm/lib/Target/X86/X86SchedHaswell.td @@ -126,6 +126,7 @@ defm : HWWriteResPair<WriteIMul64, [HWPort1], 3>; defm : X86WriteRes<WriteBSWAP32, [HWPort15], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [HWPort06, HWPort15], 2, [1,1], 2>; +defm : X86WriteRes<WriteXCHG, [HWPort0156], 2, [3], 3>; def : WriteRes<WriteIMulH, []> { let Latency = 3; } @@ -1287,15 +1288,6 @@ def: InstRW<[HWWriteResGroup53_1], (instregex "VPMOVSXBWYrm", "VPMOVSXWDYrm", "VPMOVZXWDYrm")>; -def HWWriteResGroup54 : SchedWriteRes<[HWPort0156]> { - let Latency = 2; - let NumMicroOps = 3; - let ResourceCycles = [3]; -} -def: InstRW<[HWWriteResGroup54], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; - def HWWriteResGroup57 : SchedWriteRes<[HWPort5,HWPort0156]> { let Latency = 3; let NumMicroOps = 3; diff --git a/llvm/lib/Target/X86/X86SchedSandyBridge.td b/llvm/lib/Target/X86/X86SchedSandyBridge.td index 6b7bbdea860..67f44125026 100644 --- a/llvm/lib/Target/X86/X86SchedSandyBridge.td +++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td @@ -111,6 +111,7 @@ defm : SBWriteResPair<WriteALU, [SBPort015], 1>; defm : SBWriteResPair<WriteADC, [SBPort05,SBPort015], 2, [1,1], 2>; defm : SBWriteResPair<WriteIMul, [SBPort1], 3>; defm : SBWriteResPair<WriteIMul64, [SBPort1], 3>; +defm : X86WriteRes<WriteXCHG, [SBPort015], 2, [3], 3>; defm : X86WriteRes<WriteBSWAP32, [SBPort1], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [SBPort1,SBPort05], 2, [1,1], 2>; @@ -661,15 +662,6 @@ def: InstRW<[SBWriteResGroup23_2], (instregex "ROL(8|16|32|64)rCL", "SHL(8|16|32|64)rCL", "SHR(8|16|32|64)rCL")>; -def SBWriteResGroup25 : SchedWriteRes<[SBPort015]> { - let Latency = 2; - let NumMicroOps = 3; - let ResourceCycles = [3]; -} -def: InstRW<[SBWriteResGroup25], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; - def SBWriteResGroup25_1 : SchedWriteRes<[SBPort23,SBPort015]> { let Latency = 7; let NumMicroOps = 3; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeClient.td b/llvm/lib/Target/X86/X86SchedSkylakeClient.td index bda088e1512..c940e23f59b 100644 --- a/llvm/lib/Target/X86/X86SchedSkylakeClient.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeClient.td @@ -112,6 +112,7 @@ defm : SKLWriteResPair<WriteIMul64, [SKLPort1], 3>; // Integer 64-bit multipl defm : X86WriteRes<WriteBSWAP32, [SKLPort15], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [SKLPort06, SKLPort15], 2, [1,1], 2>; +defm : X86WriteRes<WriteXCHG, [SKLPort0156], 2, [3], 3>; defm : SKLWriteResPair<WriteDiv8, [SKLPort0, SKLDivider], 25, [1,10], 1, 4>; defm : SKLWriteResPair<WriteDiv16, [SKLPort0, SKLDivider], 25, [1,10], 1, 4>; @@ -776,15 +777,6 @@ def: InstRW<[SKLWriteResGroup33], (instregex "ROL(8|16|32|64)rCL", "SHL(8|16|32|64)rCL", "SHR(8|16|32|64)rCL")>; -def SKLWriteResGroup34 : SchedWriteRes<[SKLPort0156]> { - let Latency = 2; - let NumMicroOps = 3; - let ResourceCycles = [3]; -} -def: InstRW<[SKLWriteResGroup34], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; - def SKLWriteResGroup35 : SchedWriteRes<[SKLPort0,SKLPort5]> { let Latency = 3; let NumMicroOps = 3; diff --git a/llvm/lib/Target/X86/X86SchedSkylakeServer.td b/llvm/lib/Target/X86/X86SchedSkylakeServer.td index 9d5f8555c50..0cb13eb27be 100755 --- a/llvm/lib/Target/X86/X86SchedSkylakeServer.td +++ b/llvm/lib/Target/X86/X86SchedSkylakeServer.td @@ -112,6 +112,7 @@ defm : SKXWriteResPair<WriteIMul64, [SKXPort1], 3>; // Integer 64-bit multipl defm : X86WriteRes<WriteBSWAP32, [SKXPort15], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [SKXPort06, SKXPort15], 2, [1,1], 2>; +defm : X86WriteRes<WriteXCHG, [SKXPort0156], 2, [3], 3>; defm : SKXWriteResPair<WriteDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>; defm : SKXWriteResPair<WriteDiv16, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>; @@ -844,15 +845,6 @@ def: InstRW<[SKXWriteResGroup35], (instregex "ROL(8|16|32|64)rCL", "SHL(8|16|32|64)rCL", "SHR(8|16|32|64)rCL")>; -def SKXWriteResGroup36 : SchedWriteRes<[SKXPort0156]> { - let Latency = 2; - let NumMicroOps = 3; - let ResourceCycles = [3]; -} -def: InstRW<[SKXWriteResGroup36], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; - def SKXWriteResGroup37 : SchedWriteRes<[SKXPort0,SKXPort5]> { let Latency = 3; let NumMicroOps = 3; diff --git a/llvm/lib/Target/X86/X86Schedule.td b/llvm/lib/Target/X86/X86Schedule.td index ef9ce94706d..4f123a96416 100644 --- a/llvm/lib/Target/X86/X86Schedule.td +++ b/llvm/lib/Target/X86/X86Schedule.td @@ -120,6 +120,7 @@ def WriteLEA : SchedWrite; // LEA instructions can't fold loads. def WriteBSWAP32 : SchedWrite; // Byte Order (Endianness) 32-bit Swap. def WriteBSWAP64 : SchedWrite; // Byte Order (Endianness) 64-bit Swap. +def WriteXCHG : SchedWrite; // Compare+Exchange - TODO RMW support. // Integer division. defm WriteDiv8 : X86SchedWritePair; diff --git a/llvm/lib/Target/X86/X86ScheduleAtom.td b/llvm/lib/Target/X86/X86ScheduleAtom.td index a7f461c456b..88321b7454e 100644 --- a/llvm/lib/Target/X86/X86ScheduleAtom.td +++ b/llvm/lib/Target/X86/X86ScheduleAtom.td @@ -81,6 +81,7 @@ defm : AtomWriteResPair<WriteADC, [AtomPort01], [AtomPort0]>; defm : AtomWriteResPair<WriteIMul, [AtomPort01], [AtomPort01], 7, 7, [7], [7]>; defm : AtomWriteResPair<WriteIMul64, [AtomPort01], [AtomPort01], 12, 12, [12], [12]>; +defm : X86WriteRes<WriteXCHG, [AtomPort01], 2, [2], 1>; defm : X86WriteRes<WriteBSWAP32, [AtomPort0], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [AtomPort0], 1, [1], 1>; @@ -565,8 +566,6 @@ def : InstRW<[AtomWrite01_2], (instrs LEAVE, LEAVE64, POP16r, SCASB, SCASL, SCASQ, SCASW)>; def : InstRW<[AtomWrite01_2], (instregex "BT(C|R|S)(16|32|64)mi8", "PUSH(CS|DS|ES|FS|GS|SS)(16|32|64)", - "XADD(8|16|32|64)rr", - "XCHG(8|16|32|64)(ar|rr)", "(ST|ISTT)_F(P)?(16|32|64)?(m|rr)", "MMX_P(ADD|SUB)Qirr", "MOV(S|Z)X16rr8", diff --git a/llvm/lib/Target/X86/X86ScheduleBtVer2.td b/llvm/lib/Target/X86/X86ScheduleBtVer2.td index 719e71cd25e..1c509c72fe8 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -170,6 +170,7 @@ defm : X86WriteRes<WriteIMulH, [JALU1], 6, [4], 1>; defm : X86WriteRes<WriteBSWAP32, [JALU01], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [JALU01], 1, [1], 1>; +defm : X86WriteRes<WriteXCHG, [JALU01], 1, [1], 1>; defm : JWriteResIntPair<WriteDiv8, [JALU1, JDiv], 12, [1, 12], 1>; defm : JWriteResIntPair<WriteDiv16, [JALU1, JDiv], 17, [1, 17], 2>; diff --git a/llvm/lib/Target/X86/X86ScheduleSLM.td b/llvm/lib/Target/X86/X86ScheduleSLM.td index b1e84301370..8af32f5b1eb 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -100,6 +100,7 @@ defm : SLMWriteResPair<WriteIMul64, [SLM_IEC_RSV1], 3>; defm : X86WriteRes<WriteBSWAP32, [SLM_IEC_RSV01], 1, [1], 1>; defm : X86WriteRes<WriteBSWAP64, [SLM_IEC_RSV01], 1, [1], 1>; +defm : X86WriteRes<WriteXCHG, [SLM_IEC_RSV01], 1, [1], 1>; defm : SLMWriteResPair<WriteShift, [SLM_IEC_RSV0], 1>; diff --git a/llvm/lib/Target/X86/X86ScheduleZnver1.td b/llvm/lib/Target/X86/X86ScheduleZnver1.td index 7184b850a19..24009e4a6c3 100644 --- a/llvm/lib/Target/X86/X86ScheduleZnver1.td +++ b/llvm/lib/Target/X86/X86ScheduleZnver1.td @@ -182,6 +182,7 @@ defm : ZnWriteResPair<WriteIMul64, [ZnALU1, ZnMultiplier], 4, [1,1], 2>; defm : X86WriteRes<WriteBSWAP32, [ZnALU], 1, [4], 1>; defm : X86WriteRes<WriteBSWAP64, [ZnALU], 1, [4], 1>; +defm : X86WriteRes<WriteXCHG, [ZnALU], 1, [2], 2>; defm : ZnWriteResPair<WriteShift, [ZnALU], 1>; @@ -499,14 +500,6 @@ def : InstRW<[WriteALULd, ReadAfterLd], (instregex "MOV16rm")>; def : InstRW<[WriteLoad], (instregex "MOV(S|Z)X32rm(8|16)")>; // XCHG. -// r,r. -def ZnWriteXCHG : SchedWriteRes<[ZnALU]> { - let NumMicroOps = 2; - let ResourceCycles = [2]; -} - -def : InstRW<[ZnWriteXCHG], (instregex "XCHG(8|16|32|64)rr", "XCHG(16|32|64)ar")>; - // r,m. def ZnWriteXCHGrm : SchedWriteRes<[ZnAGU, ZnALU]> { let Latency = 5; @@ -807,6 +800,8 @@ def : InstRW<[WriteMicrocoded], (instregex "SCAS(B|W|L|Q)")>; def : InstRW<[WriteMicrocoded], (instregex "STOS(B|L|Q|W)")>; // XADD. +def ZnXADD : SchedWriteRes<[ZnALU]>; +def : InstRW<[ZnXADD], (instregex "XADD(8|16|32|64)rr")>; def : InstRW<[WriteMicrocoded], (instregex "XADD(8|16|32|64)rm")>; //=== Floating Point x87 Instructions ===// |

