mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[X86][Nearly NFC] Split SHLD/SHRD into their own WriteShiftDouble class
Summary: {F6603964} While there is still some discrepancies within that new group, it is clearly separate from the other shifts. And Agner's tables agree, these double shifts are clearly different from the normal shifts/rotates. I'm guessing `FeatureSlowSHLD` is related. Indeed, a basic sched pair is *not* the /best/ match. But keeping it in the WriteShift is /clearly/ not ideal either. This can and likely will be fine-tuned later. This is purely mechanical change, it does not change any numbers, as the [lack of the change of] mca tests show. Reviewers: craig.topper, RKSimon, andreadb Reviewed By: craig.topper Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D49015 llvm-svn: 336515
This commit is contained in:
parent
bf274751c8
commit
db6cd30745
@ -650,7 +650,7 @@ def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst),
|
||||
// Double shift instructions (generalizations of rotate)
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
|
||||
let Constraints = "$src1 = $dst", SchedRW = [WriteShiftDouble] in {
|
||||
|
||||
let Uses = [CL] in {
|
||||
def SHLD16rrCL : I<0xA5, MRMDestReg, (outs GR16:$dst),
|
||||
@ -731,7 +731,7 @@ def SHRD64rri8 : RIi8<0xAC, MRMDestReg,
|
||||
}
|
||||
} // Constraints = "$src = $dst", SchedRW
|
||||
|
||||
let SchedRW = [WriteShiftLd, WriteRMW] in {
|
||||
let SchedRW = [WriteShiftDoubleLd, WriteRMW] in {
|
||||
let Uses = [CL] in {
|
||||
def SHLD16mrCL : I<0xA5, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
|
||||
"shld{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
|
||||
|
@ -146,6 +146,9 @@ defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
|
||||
// Integer shifts and rotates.
|
||||
defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
|
||||
|
||||
// Double shift instructions.
|
||||
defm : BWWriteResPair<WriteShiftDouble, [BWPort06], 1>;
|
||||
|
||||
// BMI1 BEXTR, BMI2 BZHI
|
||||
defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
|
||||
defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
|
||||
|
@ -124,6 +124,7 @@ defm : HWWriteResPair<WriteIMul, [HWPort1], 3>;
|
||||
defm : HWWriteResPair<WriteIMul64, [HWPort1], 3>;
|
||||
def : WriteRes<WriteIMulH, []> { let Latency = 3; }
|
||||
defm : HWWriteResPair<WriteShift, [HWPort06], 1>;
|
||||
defm : HWWriteResPair<WriteShiftDouble, [HWPort06], 1>;
|
||||
defm : HWWriteResPair<WriteJump, [HWPort06], 1>;
|
||||
defm : HWWriteResPair<WriteCRC32, [HWPort1], 3>;
|
||||
|
||||
|
@ -123,6 +123,7 @@ defm : SBWriteResPair<WriteIDiv64, [SBPort0, SBDivider], 25, [1, 10]>;
|
||||
def : WriteRes<WriteIMulH, []> { let Latency = 3; }
|
||||
|
||||
defm : SBWriteResPair<WriteShift, [SBPort05], 1>;
|
||||
defm : SBWriteResPair<WriteShiftDouble, [SBPort05], 1>;
|
||||
defm : SBWriteResPair<WriteJump, [SBPort5], 1>;
|
||||
defm : SBWriteResPair<WriteCRC32, [SBPort1], 3, [1], 1, 5>;
|
||||
|
||||
|
@ -144,6 +144,9 @@ defm : SKLWriteResPair<WritePOPCNT, [SKLPort1], 3>;
|
||||
// Integer shifts and rotates.
|
||||
defm : SKLWriteResPair<WriteShift, [SKLPort06], 1>;
|
||||
|
||||
// Double shift instructions.
|
||||
defm : SKLWriteResPair<WriteShiftDouble, [SKLPort06], 1>;
|
||||
|
||||
// BMI1 BEXTR, BMI2 BZHI
|
||||
defm : SKLWriteResPair<WriteBEXTR, [SKLPort06,SKLPort15], 2, [1,1], 2>;
|
||||
defm : SKLWriteResPair<WriteBZHI, [SKLPort15], 1>;
|
||||
|
@ -137,6 +137,9 @@ def : WriteRes<WriteLAHFSAHF, [SKXPort06]>;
|
||||
// Integer shifts and rotates.
|
||||
defm : SKXWriteResPair<WriteShift, [SKXPort06], 1>;
|
||||
|
||||
// Double shift instructions.
|
||||
defm : SKXWriteResPair<WriteShiftDouble, [SKXPort06], 1>;
|
||||
|
||||
// Bit counts.
|
||||
defm : SKXWriteResPair<WriteBSF, [SKXPort1], 3>;
|
||||
defm : SKXWriteResPair<WriteBSR, [SKXPort1], 3>;
|
||||
|
@ -142,6 +142,8 @@ def WriteLAHFSAHF : SchedWrite; // Load/Store flags in AH.
|
||||
|
||||
// Integer shifts and rotates.
|
||||
defm WriteShift : X86SchedWritePair;
|
||||
// Double shift instructions.
|
||||
defm WriteShiftDouble : X86SchedWritePair;
|
||||
|
||||
// BMI1 BEXTR, BMI2 BZHI
|
||||
defm WriteBEXTR : X86SchedWritePair;
|
||||
|
@ -147,6 +147,12 @@ defm : X86WriteResPairUnsupported<WriteBZHI>;
|
||||
|
||||
defm : AtomWriteResPair<WriteShift, [AtomPort0], [AtomPort0]>;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Double shift instructions.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
defm : AtomWriteResPair<WriteShiftDouble, [AtomPort0], [AtomPort0]>;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Loads, stores, and moves, not folded with other operations.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -200,6 +200,8 @@ defm : X86WriteResPairUnsupported<WriteBZHI>;
|
||||
|
||||
defm : JWriteResIntPair<WriteShift, [JALU01], 1>;
|
||||
|
||||
defm : JWriteResIntPair<WriteShiftDouble, [JALU01], 1>;
|
||||
|
||||
def JWriteSHLDrri : SchedWriteRes<[JALU01]> {
|
||||
let Latency = 3;
|
||||
let ResourceCycles = [6];
|
||||
|
@ -98,6 +98,7 @@ defm : SLMWriteResPair<WriteADC, [SLM_IEC_RSV01], 1>;
|
||||
defm : SLMWriteResPair<WriteIMul, [SLM_IEC_RSV1], 3>;
|
||||
defm : SLMWriteResPair<WriteIMul64, [SLM_IEC_RSV1], 3>;
|
||||
defm : SLMWriteResPair<WriteShift, [SLM_IEC_RSV0], 1>;
|
||||
defm : SLMWriteResPair<WriteShiftDouble, [SLM_IEC_RSV0], 1>;
|
||||
defm : SLMWriteResPair<WriteJump, [SLM_IEC_RSV1], 1>;
|
||||
defm : SLMWriteResPair<WriteCRC32, [SLM_IEC_RSV1], 3>;
|
||||
|
||||
|
@ -180,6 +180,7 @@ defm : ZnWriteResPair<WriteADC, [ZnALU], 1>;
|
||||
defm : ZnWriteResPair<WriteIMul, [ZnALU1, ZnMultiplier], 4>;
|
||||
defm : ZnWriteResPair<WriteIMul64, [ZnALU1, ZnMultiplier], 4, [1,1], 2>;
|
||||
defm : ZnWriteResPair<WriteShift, [ZnALU], 1>;
|
||||
defm : ZnWriteResPair<WriteShiftDouble, [ZnALU], 1>;
|
||||
defm : ZnWriteResPair<WriteJump, [ZnALU], 1>;
|
||||
defm : ZnWriteResFpuPair<WriteCRC32, [ZnFPU0], 3>;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user