X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetInstrInfo.cpp;h=10a5cdb6247a9fb44aa02a660203960c72d6f2e1;hb=6fa1c051dc515b6fd1f9a26ac12fed985469bff5;hp=115f2c2a7c353bb06fe5c4e4eac0c06190630451;hpb=adc101bbcd39a276c37d7ca1b20526c1016379b4;p=oota-llvm.git diff --git a/lib/Target/TargetInstrInfo.cpp b/lib/Target/TargetInstrInfo.cpp index 115f2c2a7c3..10a5cdb6247 100644 --- a/lib/Target/TargetInstrInfo.cpp +++ b/lib/Target/TargetInstrInfo.cpp @@ -1,61 +1,50 @@ -//===-- TargetMachine.cpp - General Target Information ---------------------==// +//===-- TargetInstrInfo.cpp - Target Instruction Information --------------===// // -// This file describes the general parts of a Target machine. -// This file also implements MachineInstrInfo and MachineCacheInfo. +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the TargetInstrInfo class. // //===----------------------------------------------------------------------===// -#include "llvm/Target/MachineInstrInfo.h" +#include "llvm/Target/TargetInstrInfo.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 MachineInstrDescriptor* TargetInstrDescriptors = 0; - -//--------------------------------------------------------------------------- -// class MachineInstructionInfo -// Interface to description of machine instructions -//--------------------------------------------------------------------------- +using namespace llvm; + +/// findTiedToSrcOperand - Returns the operand that is tied to the specified +/// dest operand. Returns -1 if there isn't one. +int TargetInstrDesc::findTiedToSrcOperand(unsigned OpNum) const { + for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { + if (i == OpNum) + continue; + if (getOperandConstraint(i, TOI::TIED_TO) == (int)OpNum) + return i; + } + return -1; +} -MachineInstrInfo::MachineInstrInfo(const MachineInstrDescriptor* 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(const TargetInstrDesc* Desc, + unsigned numOpcodes) + : Descriptors(Desc), NumOpcodes(numOpcodes) { } -MachineInstrInfo::~MachineInstrInfo() { - TargetInstrDescriptors = NULL; // reset global variable +TargetInstrInfo::~TargetInstrInfo() { } - -bool MachineInstrInfo::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; - } +bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const { + const TargetInstrDesc &TID = MI->getDesc(); + if (!TID.isTerminator()) return false; - return false; -} - -bool MachineInstrInfo::ConstantTypeMustBeLoaded(const Constant* CV) const { - assert(CV->getType()->isPrimitiveType() || isa(CV->getType())); - return !(CV->getType()->isIntegral() || isa(CV->getType())); + // Conditional branch is a special case. + if (TID.isBranch() && !TID.isBarrier()) + return true; + if (!TID.isPredicable()) + return true; + return !isPredicated(MI); }