mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 23:20:54 +00:00
d714fcf5c8
Previously, subtarget features were a bitfield with the underlying type being uint64_t. Since several targets (X86 and ARM, in particular) have hit or were very close to hitting this bound, switching the features to use a bitset. No functional change. The first several times this was committed (e.g. r229831, r233055), it caused several buildbot failures. Apparently the reason for most failures was both clang and gcc's inability to deal with large numbers (> 10K) of bitset constructor calls in tablegen-generated initializers of instruction info tables. This should now be fixed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238192 91177308-0d34-0410-b5e6-96231b3b80d8
71 lines
2.6 KiB
C++
71 lines
2.6 KiB
C++
//===------ 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"
|
|
#include "llvm/MC/MCRegisterInfo.h"
|
|
#include "llvm/MC/MCSubtargetInfo.h"
|
|
|
|
using namespace llvm;
|
|
|
|
bool MCInstrDesc::getDeprecatedInfo(MCInst &MI, MCSubtargetInfo &STI,
|
|
std::string &Info) const {
|
|
if (ComplexDeprecationInfo)
|
|
return ComplexDeprecationInfo(MI, STI, Info);
|
|
if (DeprecatedFeature != -1 && STI.getFeatureBits()[DeprecatedFeature]) {
|
|
// 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);
|
|
}
|