Index: lib/Target/X86/X86InstrInfo.td =================================================================== --- lib/Target/X86/X86InstrInfo.td +++ lib/Target/X86/X86InstrInfo.td @@ -1994,7 +1994,7 @@ 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), Index: lib/Target/X86/X86SchedBroadwell.td =================================================================== --- lib/Target/X86/X86SchedBroadwell.td +++ lib/Target/X86/X86SchedBroadwell.td @@ -121,6 +121,7 @@ defm : BWWriteResPair; // defm : BWWriteResPair; // +defm : X86WriteRes; defm : BWWriteResPair; def : WriteRes { let Latency = 3; } // Integer multiplication, high part. @@ -770,9 +771,7 @@ let NumMicroOps = 3; let ResourceCycles = [3]; } -def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; +def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr)>; def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> { let Latency = 3; Index: lib/Target/X86/X86SchedHaswell.td =================================================================== --- lib/Target/X86/X86SchedHaswell.td +++ lib/Target/X86/X86SchedHaswell.td @@ -125,6 +125,7 @@ defm : HWWriteResPair; defm : HWWriteResPair; +defm : X86WriteRes; def : WriteRes { let Latency = 3; } defm : HWWriteResPair; @@ -1292,9 +1293,7 @@ let NumMicroOps = 3; let ResourceCycles = [3]; } -def: InstRW<[HWWriteResGroup54], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; +def: InstRW<[HWWriteResGroup54], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr)>; def HWWriteResGroup57 : SchedWriteRes<[HWPort5,HWPort0156]> { let Latency = 3; Index: lib/Target/X86/X86SchedSandyBridge.td =================================================================== --- lib/Target/X86/X86SchedSandyBridge.td +++ lib/Target/X86/X86SchedSandyBridge.td @@ -110,6 +110,7 @@ defm : SBWriteResPair; defm : SBWriteResPair; defm : SBWriteResPair; +defm : X86WriteRes; defm : SBWriteResPair; defm : SBWriteResPair; @@ -675,9 +676,7 @@ let NumMicroOps = 3; let ResourceCycles = [3]; } -def: InstRW<[SBWriteResGroup25], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; +def: InstRW<[SBWriteResGroup25], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr)>; def SBWriteResGroup25_1 : SchedWriteRes<[SBPort23,SBPort015]> { let Latency = 7; Index: lib/Target/X86/X86SchedSkylakeClient.td =================================================================== --- lib/Target/X86/X86SchedSkylakeClient.td +++ lib/Target/X86/X86SchedSkylakeClient.td @@ -112,6 +112,7 @@ defm : SKLWriteResPair; // defm : SKLWriteResPair; // +defm : X86WriteRes; defm : SKLWriteResPair; defm : SKLWriteResPair; @@ -787,9 +788,7 @@ let NumMicroOps = 3; let ResourceCycles = [3]; } -def: InstRW<[SKLWriteResGroup34], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; +def: InstRW<[SKLWriteResGroup34], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr)>; def SKLWriteResGroup35 : SchedWriteRes<[SKLPort0,SKLPort5]> { let Latency = 3; Index: lib/Target/X86/X86SchedSkylakeServer.td =================================================================== --- lib/Target/X86/X86SchedSkylakeServer.td +++ lib/Target/X86/X86SchedSkylakeServer.td @@ -112,6 +112,7 @@ defm : SKXWriteResPair; // defm : SKXWriteResPair; // +defm : X86WriteRes; defm : SKXWriteResPair; defm : SKXWriteResPair; @@ -855,9 +856,7 @@ let NumMicroOps = 3; let ResourceCycles = [3]; } -def: InstRW<[SKXWriteResGroup36], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr, - XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr, - XCHG16ar, XCHG32ar, XCHG64ar)>; +def: InstRW<[SKXWriteResGroup36], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr)>; def SKXWriteResGroup37 : SchedWriteRes<[SKXPort0,SKXPort5]> { let Latency = 3; Index: lib/Target/X86/X86Schedule.td =================================================================== --- lib/Target/X86/X86Schedule.td +++ lib/Target/X86/X86Schedule.td @@ -120,6 +120,7 @@ defm WriteBSWAP32: X86SchedWritePair; // Byte Order (Endiannes) Swap defm WriteBSWAP64: X86SchedWritePair; // Byte Order (Endiannes) Swap +def WriteXCHG : SchedWrite; // Integer division. defm WriteDiv8 : X86SchedWritePair; Index: lib/Target/X86/X86ScheduleAtom.td =================================================================== --- lib/Target/X86/X86ScheduleAtom.td +++ lib/Target/X86/X86ScheduleAtom.td @@ -81,8 +81,9 @@ defm : AtomWriteResPair; defm : AtomWriteResPair; -defm : AtomWriteResPair; -defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : AtomWriteResPair; +defm : X86WriteRes; defm : AtomWriteResPair; defm : AtomWriteResPair; @@ -568,7 +569,6 @@ 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", Index: lib/Target/X86/X86ScheduleBtVer2.td =================================================================== --- lib/Target/X86/X86ScheduleBtVer2.td +++ lib/Target/X86/X86ScheduleBtVer2.td @@ -170,6 +170,7 @@ defm : JWriteResIntPair; defm : JWriteResIntPair; +defm : X86WriteRes; defm : JWriteResIntPair; defm : JWriteResIntPair; Index: lib/Target/X86/X86ScheduleSLM.td =================================================================== --- lib/Target/X86/X86ScheduleSLM.td +++ lib/Target/X86/X86ScheduleSLM.td @@ -100,6 +100,7 @@ defm : SLMWriteResPair; defm : SLMWriteResPair; +defm : X86WriteRes; defm : SLMWriteResPair; defm : SLMWriteResPair; Index: lib/Target/X86/X86ScheduleZnver1.td =================================================================== --- lib/Target/X86/X86ScheduleZnver1.td +++ lib/Target/X86/X86ScheduleZnver1.td @@ -182,6 +182,7 @@ defm : ZnWriteResPair; defm : ZnWriteResPair; +defm : X86WriteRes; defm : ZnWriteResPair; defm : ZnWriteResPair; @@ -493,14 +494,6 @@ 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;