mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
6f2c46cd52
SingleSource except oopack and Oscar. (Sorry, Oscar.) include/llvm/Target/TargetInstrInfo.h: Remove virtual print method. Add accessors for ImplicitUses/Defs. lib/Target/TargetInstrInfo.cpp: Remove virtual print method. If you really wanted this, just use MI->print(O, TM); instead... lib/Target/X86: FloatingPoint.cpp: ...like this. X86InstrInfo.h: Remove virtual print method. Define the PrintImplUses target-specific flag bit. X86InstrInfo.def: Add the PrintImplUses flag to all the instructions which implicitly use CL, because the assembler needs to see the CL in order to generate the right instruction. Printer.cpp: Ditch fnIndex at Chris's request. Now we use CurrentFnName to name constants in the constant pool for each function instead. This avoids keeping state between runOnMachineFunction() invocations, which is a no-no. Having MangledGlobals be global is a bogon I'd like to get rid of too, but making it a static member of Printer causes link errors (why???). Make NumberForBB into a member of Printer instead of a global, too. Make printOp and printMemReference into methods of Printer. X86InstrInfo::print is now Printer::printMachineInstruction, because TargetInstrInfo::print is history. (Because of this, we have to qualify the names of some TargetInstrInfo methods we call.) Print out the ImplicitUses field of any instruction we print that has the PrintImplUses bit set. llvm-svn: 6924
55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
//===-- TargetInstrInfo.cpp - Target Instruction Information --------------===//
|
|
//
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Target/TargetInstrInfo.h"
|
|
#include "llvm/CodeGen/MachineInstr.h"
|
|
#include "llvm/Constant.h"
|
|
#include "llvm/DerivedTypes.h"
|
|
|
|
// External object describing the machine instructions
|
|
// Initialized only when the TargetMachine class is created
|
|
// and reset when that class is destroyed.
|
|
//
|
|
const TargetInstrDescriptor* TargetInstrDescriptors = 0;
|
|
|
|
|
|
TargetInstrInfo::TargetInstrInfo(const TargetInstrDescriptor* Desc,
|
|
unsigned DescSize,
|
|
unsigned NumRealOpCodes)
|
|
: desc(Desc), descSize(DescSize), numRealOpCodes(NumRealOpCodes) {
|
|
// FIXME: TargetInstrDescriptors should not be global
|
|
assert(TargetInstrDescriptors == NULL && desc != NULL);
|
|
TargetInstrDescriptors = desc; // initialize global variable
|
|
}
|
|
|
|
TargetInstrInfo::~TargetInstrInfo() {
|
|
TargetInstrDescriptors = NULL; // reset global variable
|
|
}
|
|
|
|
bool TargetInstrInfo::constantFitsInImmedField(MachineOpCode opCode,
|
|
int64_t intValue) const {
|
|
// First, check if opCode has an immed field.
|
|
bool isSignExtended;
|
|
uint64_t maxImmedValue = maxImmedConstant(opCode, isSignExtended);
|
|
if (maxImmedValue != 0)
|
|
{
|
|
// NEED TO HANDLE UNSIGNED VALUES SINCE THEY MAY BECOME MUCH
|
|
// SMALLER AFTER CASTING TO SIGN-EXTENDED int, short, or char.
|
|
// See CreateUIntSetInstruction in SparcInstrInfo.cpp.
|
|
|
|
// Now check if the constant fits
|
|
if (intValue <= (int64_t) maxImmedValue &&
|
|
intValue >= -((int64_t) maxImmedValue+1))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool TargetInstrInfo::ConstantTypeMustBeLoaded(const Constant* CV) const {
|
|
assert(CV->getType()->isPrimitiveType() || isa<PointerType>(CV->getType()));
|
|
return !(CV->getType()->isIntegral() || isa<PointerType>(CV->getType()));
|
|
}
|