mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Move some methods to a new MCInstrDesc.cpp file to allow includes to be trimmed. NFC.
MCInstrDesc.h includes things like MCInst.h which i can now remove after this. That will be a future commit. Reviewed by Jim Grosbach. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237478 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e892415f25
commit
9e514203d1
@ -165,16 +165,7 @@ public:
|
|||||||
/// \brief Returns true if a certain instruction is deprecated and if so
|
/// \brief Returns true if a certain instruction is deprecated and if so
|
||||||
/// returns the reason in \p Info.
|
/// returns the reason in \p Info.
|
||||||
bool getDeprecatedInfo(MCInst &MI, MCSubtargetInfo &STI,
|
bool getDeprecatedInfo(MCInst &MI, MCSubtargetInfo &STI,
|
||||||
std::string &Info) const {
|
std::string &Info) const;
|
||||||
if (ComplexDeprecationInfo)
|
|
||||||
return ComplexDeprecationInfo(MI, STI, Info);
|
|
||||||
if ((DeprecatedFeatureMask & STI.getFeatureBits()) != 0) {
|
|
||||||
// FIXME: it would be nice to include the subtarget feature here.
|
|
||||||
Info = "deprecated";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Return the opcode number for this descriptor.
|
/// \brief Return the opcode number for this descriptor.
|
||||||
unsigned getOpcode() const { return Opcode; }
|
unsigned getOpcode() const { return Opcode; }
|
||||||
@ -257,25 +248,7 @@ public:
|
|||||||
/// \brief Return true if this is a branch or an instruction which directly
|
/// \brief Return true if this is a branch or an instruction which directly
|
||||||
/// writes to the program counter. Considered 'may' affect rather than
|
/// writes to the program counter. Considered 'may' affect rather than
|
||||||
/// 'does' affect as things like predication are not taken into account.
|
/// 'does' affect as things like predication are not taken into account.
|
||||||
bool mayAffectControlFlow(const MCInst &MI, const MCRegisterInfo &RI) const {
|
bool mayAffectControlFlow(const MCInst &MI, const MCRegisterInfo &RI) const;
|
||||||
if (isBranch() || isCall() || isReturn() || isIndirectBranch())
|
|
||||||
return true;
|
|
||||||
unsigned PC = RI.getProgramCounter();
|
|
||||||
if (PC == 0)
|
|
||||||
return false;
|
|
||||||
if (hasDefOfPhysReg(MI, PC, RI))
|
|
||||||
return true;
|
|
||||||
// A variadic instruction may define PC in the variable operand list.
|
|
||||||
// There's currently no indication of which entries in a variable
|
|
||||||
// list are defs and which are uses. While that's the case, this function
|
|
||||||
// needs to assume they're defs in order to be conservatively correct.
|
|
||||||
for (int i = NumOperands, e = MI.getNumOperands(); i != e; ++i) {
|
|
||||||
if (MI.getOperand(i).isReg() &&
|
|
||||||
RI.isSubRegisterEq(PC, MI.getOperand(i).getReg()))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Return true if this instruction has a predicate operand
|
/// \brief Return true if this instruction has a predicate operand
|
||||||
/// that controls execution. It may be set to 'always', or may be set to other
|
/// that controls execution. It may be set to 'always', or may be set to other
|
||||||
@ -532,24 +505,7 @@ public:
|
|||||||
/// \brief Return true if this instruction implicitly
|
/// \brief Return true if this instruction implicitly
|
||||||
/// defines the specified physical register.
|
/// defines the specified physical register.
|
||||||
bool hasImplicitDefOfPhysReg(unsigned Reg,
|
bool hasImplicitDefOfPhysReg(unsigned Reg,
|
||||||
const MCRegisterInfo *MRI = nullptr) const {
|
const MCRegisterInfo *MRI = nullptr) const;
|
||||||
if (const uint16_t *ImpDefs = ImplicitDefs)
|
|
||||||
for (; *ImpDefs; ++ImpDefs)
|
|
||||||
if (*ImpDefs == Reg || (MRI && MRI->isSubRegister(Reg, *ImpDefs)))
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Return true if this instruction defines the specified physical
|
|
||||||
/// register, either explicitly or implicitly.
|
|
||||||
bool hasDefOfPhysReg(const MCInst &MI, unsigned Reg,
|
|
||||||
const MCRegisterInfo &RI) const {
|
|
||||||
for (int i = 0, e = NumDefs; i != e; ++i)
|
|
||||||
if (MI.getOperand(i).isReg() &&
|
|
||||||
RI.isSubRegisterEq(Reg, MI.getOperand(i).getReg()))
|
|
||||||
return true;
|
|
||||||
return hasImplicitDefOfPhysReg(Reg, &RI);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Return the scheduling class for this instruction. The
|
/// \brief Return the scheduling class for this instruction. The
|
||||||
/// scheduling class is an index into the InstrItineraryData table. This
|
/// scheduling class is an index into the InstrItineraryData table. This
|
||||||
@ -572,6 +528,13 @@ public:
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/// \brief Return true if this instruction defines the specified physical
|
||||||
|
/// register, either explicitly or implicitly.
|
||||||
|
bool hasDefOfPhysReg(const MCInst &MI, unsigned Reg,
|
||||||
|
const MCRegisterInfo &RI) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
@ -19,6 +19,7 @@ add_llvm_library(LLVMMC
|
|||||||
MCInst.cpp
|
MCInst.cpp
|
||||||
MCInstPrinter.cpp
|
MCInstPrinter.cpp
|
||||||
MCInstrAnalysis.cpp
|
MCInstrAnalysis.cpp
|
||||||
|
MCInstrDesc.cpp
|
||||||
MCLabel.cpp
|
MCLabel.cpp
|
||||||
MCLinkerOptimizationHint.cpp
|
MCLinkerOptimizationHint.cpp
|
||||||
MCMachOStreamer.cpp
|
MCMachOStreamer.cpp
|
||||||
|
68
lib/MC/MCInstrDesc.cpp
Normal file
68
lib/MC/MCInstrDesc.cpp
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
//===------ llvm/MC/MCInstrDesc.cpp- Instruction Descriptors --------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file defines methods on the MCOperandInfo and MCInstrDesc classes, which
|
||||||
|
// are used to describe target instructions and their operands.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "llvm/MC/MCInstrDesc.h"
|
||||||
|
#include "llvm/MC/MCInst.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
bool MCInstrDesc::getDeprecatedInfo(MCInst &MI, MCSubtargetInfo &STI,
|
||||||
|
std::string &Info) const {
|
||||||
|
if (ComplexDeprecationInfo)
|
||||||
|
return ComplexDeprecationInfo(MI, STI, Info);
|
||||||
|
if ((DeprecatedFeatureMask & STI.getFeatureBits()) != 0) {
|
||||||
|
// FIXME: it would be nice to include the subtarget feature here.
|
||||||
|
Info = "deprecated";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool MCInstrDesc::mayAffectControlFlow(const MCInst &MI,
|
||||||
|
const MCRegisterInfo &RI) const {
|
||||||
|
if (isBranch() || isCall() || isReturn() || isIndirectBranch())
|
||||||
|
return true;
|
||||||
|
unsigned PC = RI.getProgramCounter();
|
||||||
|
if (PC == 0)
|
||||||
|
return false;
|
||||||
|
if (hasDefOfPhysReg(MI, PC, RI))
|
||||||
|
return true;
|
||||||
|
// A variadic instruction may define PC in the variable operand list.
|
||||||
|
// There's currently no indication of which entries in a variable
|
||||||
|
// list are defs and which are uses. While that's the case, this function
|
||||||
|
// needs to assume they're defs in order to be conservatively correct.
|
||||||
|
for (int i = NumOperands, e = MI.getNumOperands(); i != e; ++i) {
|
||||||
|
if (MI.getOperand(i).isReg() &&
|
||||||
|
RI.isSubRegisterEq(PC, MI.getOperand(i).getReg()))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MCInstrDesc::hasImplicitDefOfPhysReg(unsigned Reg,
|
||||||
|
const MCRegisterInfo *MRI) const {
|
||||||
|
if (const uint16_t *ImpDefs = ImplicitDefs)
|
||||||
|
for (; *ImpDefs; ++ImpDefs)
|
||||||
|
if (*ImpDefs == Reg || (MRI && MRI->isSubRegister(Reg, *ImpDefs)))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MCInstrDesc::hasDefOfPhysReg(const MCInst &MI, unsigned Reg,
|
||||||
|
const MCRegisterInfo &RI) const {
|
||||||
|
for (int i = 0, e = NumDefs; i != e; ++i)
|
||||||
|
if (MI.getOperand(i).isReg() &&
|
||||||
|
RI.isSubRegisterEq(Reg, MI.getOperand(i).getReg()))
|
||||||
|
return true;
|
||||||
|
return hasImplicitDefOfPhysReg(Reg, &RI);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user