diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/MC/MCInstrAnalysis.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp | 78 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ScheduleBtVer2.td | 62 |
3 files changed, 67 insertions, 78 deletions
diff --git a/llvm/lib/MC/MCInstrAnalysis.cpp b/llvm/lib/MC/MCInstrAnalysis.cpp index 4d7c8911689..8223f3a5c66 100644 --- a/llvm/lib/MC/MCInstrAnalysis.cpp +++ b/llvm/lib/MC/MCInstrAnalysis.cpp @@ -24,11 +24,6 @@ bool MCInstrAnalysis::clearsSuperRegisters(const MCRegisterInfo &MRI, return false; } -bool MCInstrAnalysis::isDependencyBreaking(const MCSubtargetInfo &STI, - const MCInst &Inst) const { - return false; -} - bool MCInstrAnalysis::evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size, uint64_t &Target) const { if (Inst.getNumOperands() == 0 || diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp index bc682263975..362ca96ac09 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -380,8 +380,9 @@ class X86MCInstrAnalysis : public MCInstrAnalysis { public: X86MCInstrAnalysis(const MCInstrInfo *MCII) : MCInstrAnalysis(MCII) {} - bool isDependencyBreaking(const MCSubtargetInfo &STI, - const MCInst &Inst) const override; +#define GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS +#include "X86GenSubtargetInfo.inc" + bool clearsSuperRegisters(const MCRegisterInfo &MRI, const MCInst &Inst, APInt &Mask) const override; std::vector<std::pair<uint64_t, uint64_t>> @@ -390,77 +391,8 @@ public: const Triple &TargetTriple) const override; }; -bool X86MCInstrAnalysis::isDependencyBreaking(const MCSubtargetInfo &STI, - const MCInst &Inst) const { - if (STI.getCPU() == "btver2") { - // Reference: Agner Fog's microarchitecture.pdf - Section 20 "AMD Bobcat and - // Jaguar pipeline", subsection 8 "Dependency-breaking instructions". - switch (Inst.getOpcode()) { - default: - return false; - case X86::SUB32rr: - case X86::SUB64rr: - case X86::SBB32rr: - case X86::SBB64rr: - case X86::XOR32rr: - case X86::XOR64rr: - case X86::XORPSrr: - case X86::XORPDrr: - case X86::VXORPSrr: - case X86::VXORPDrr: - case X86::ANDNPSrr: - case X86::VANDNPSrr: - case X86::ANDNPDrr: - case X86::VANDNPDrr: - case X86::PXORrr: - case X86::VPXORrr: - case X86::PANDNrr: - case X86::VPANDNrr: - case X86::PSUBBrr: - case X86::PSUBWrr: - case X86::PSUBDrr: - case X86::PSUBQrr: - case X86::VPSUBBrr: - case X86::VPSUBWrr: - case X86::VPSUBDrr: - case X86::VPSUBQrr: - case X86::PCMPEQBrr: - case X86::PCMPEQWrr: - case X86::PCMPEQDrr: - case X86::PCMPEQQrr: - case X86::VPCMPEQBrr: - case X86::VPCMPEQWrr: - case X86::VPCMPEQDrr: - case X86::VPCMPEQQrr: - case X86::PCMPGTBrr: - case X86::PCMPGTWrr: - case X86::PCMPGTDrr: - case X86::PCMPGTQrr: - case X86::VPCMPGTBrr: - case X86::VPCMPGTWrr: - case X86::VPCMPGTDrr: - case X86::VPCMPGTQrr: - case X86::MMX_PXORirr: - case X86::MMX_PANDNirr: - case X86::MMX_PSUBBirr: - case X86::MMX_PSUBDirr: - case X86::MMX_PSUBQirr: - case X86::MMX_PSUBWirr: - case X86::MMX_PCMPGTBirr: - case X86::MMX_PCMPGTDirr: - case X86::MMX_PCMPGTWirr: - case X86::MMX_PCMPEQBirr: - case X86::MMX_PCMPEQDirr: - case X86::MMX_PCMPEQWirr: - return Inst.getOperand(1).getReg() == Inst.getOperand(2).getReg(); - case X86::CMP32rr: - case X86::CMP64rr: - return Inst.getOperand(0).getReg() == Inst.getOperand(1).getReg(); - } - } - - return false; -} +#define GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS +#include "X86GenSubtargetInfo.inc" bool X86MCInstrAnalysis::clearsSuperRegisters(const MCRegisterInfo &MRI, const MCInst &Inst, diff --git a/llvm/lib/Target/X86/X86ScheduleBtVer2.td b/llvm/lib/Target/X86/X86ScheduleBtVer2.td index 9b1a45467e2..af5ce7bbfe8 100644 --- a/llvm/lib/Target/X86/X86ScheduleBtVer2.td +++ b/llvm/lib/Target/X86/X86ScheduleBtVer2.td @@ -687,4 +687,66 @@ def JSlowLEA16r : SchedWriteRes<[JALU01]> { def : InstRW<[JSlowLEA16r], (instrs LEA16r)>; +/////////////////////////////////////////////////////////////////////////////// +// Dependency breaking instructions. +/////////////////////////////////////////////////////////////////////////////// + +def : IsZeroIdiomFunction<[ + // GPR Zero-idioms. + DepBreakingClass<[ SUB32rr, SUB64rr, XOR32rr, XOR64rr ], ZeroIdiomPredicate>, + + // MMX Zero-idioms. + DepBreakingClass<[ + MMX_PXORirr, MMX_PANDNirr, MMX_PSUBBirr, + MMX_PSUBDirr, MMX_PSUBQirr, MMX_PSUBWirr, + MMX_PCMPGTBirr, MMX_PCMPGTDirr, MMX_PCMPGTWirr + ], ZeroIdiomPredicate>, + + // SSE Zero-idioms. + DepBreakingClass<[ + // fp variants. + XORPSrr, XORPDrr, ANDNPSrr, ANDNPDrr, + + // int variants. + PXORrr, PANDNrr, + PSUBBrr, PSUBWrr, PSUBDrr, PSUBQrr, + PCMPGTBrr, PCMPGTDrr, PCMPGTQrr, PCMPGTWrr + ], ZeroIdiomPredicate>, + + // AVX Zero-idioms. + DepBreakingClass<[ + // xmm fp variants. + VXORPSrr, VXORPDrr, VANDNPSrr, VANDNPDrr, + + // xmm int variants. + VPXORrr, VPANDNrr, + VPSUBBrr, VPSUBWrr, VPSUBDrr, VPSUBQrr, + VPCMPGTBrr, VPCMPGTWrr, VPCMPGTDrr, VPCMPGTQrr, + + // ymm variants. + VXORPSYrr, VXORPDYrr, VANDNPSYrr, VANDNPDYrr + ], ZeroIdiomPredicate> +]>; + +def : IsDepBreakingFunction<[ + // GPR + DepBreakingClass<[ SBB32rr, SBB64rr ], ZeroIdiomPredicate>, + DepBreakingClass<[ CMP32rr, CMP64rr ], CheckSameRegOperand<0, 1> >, + + // MMX + DepBreakingClass<[ + MMX_PCMPEQBirr, MMX_PCMPEQDirr, MMX_PCMPEQWirr + ], ZeroIdiomPredicate>, + + // SSE + DepBreakingClass<[ + PCMPEQBrr, PCMPEQWrr, PCMPEQDrr, PCMPEQQrr + ], ZeroIdiomPredicate>, + + // AVX + DepBreakingClass<[ + VPCMPEQBrr, VPCMPEQWrr, VPCMPEQDrr, VPCMPEQQrr + ], ZeroIdiomPredicate> +]>; + } // SchedModel |