|  | //===-- TargetInstrInfo.cpp - Target Instruction Information --------------===// | 
|  | // | 
|  | //                     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/TargetInstrInfo.h" | 
|  | #include "llvm/MC/MCAsmInfo.h" | 
|  | #include "llvm/Target/TargetRegisterInfo.h" | 
|  | #include "llvm/Support/ErrorHandling.h" | 
|  | using namespace llvm; | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | //  TargetOperandInfo | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | /// getRegClass - Get the register class for the operand, handling resolution | 
|  | /// of "symbolic" pointer register classes etc.  If this is not a register | 
|  | /// operand, this returns null. | 
|  | const TargetRegisterClass * | 
|  | TargetOperandInfo::getRegClass(const TargetRegisterInfo *TRI) const { | 
|  | if (isLookupPtrRegClass()) | 
|  | return TRI->getPointerRegClass(RegClass); | 
|  | return TRI->getRegClass(RegClass); | 
|  | } | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | //  TargetInstrInfo | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | TargetInstrInfo::TargetInstrInfo(const TargetInstrDesc* Desc, | 
|  | unsigned numOpcodes) | 
|  | : Descriptors(Desc), NumOpcodes(numOpcodes) { | 
|  | } | 
|  |  | 
|  | TargetInstrInfo::~TargetInstrInfo() { | 
|  | } | 
|  |  | 
|  | /// insertNoop - Insert a noop into the instruction stream at the specified | 
|  | /// point. | 
|  | void TargetInstrInfo::insertNoop(MachineBasicBlock &MBB, | 
|  | MachineBasicBlock::iterator MI) const { | 
|  | llvm_unreachable("Target didn't implement insertNoop!"); | 
|  | } | 
|  |  | 
|  |  | 
|  | bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const { | 
|  | const TargetInstrDesc &TID = MI->getDesc(); | 
|  | if (!TID.isTerminator()) return false; | 
|  |  | 
|  | // Conditional branch is a special case. | 
|  | if (TID.isBranch() && !TID.isBarrier()) | 
|  | return true; | 
|  | if (!TID.isPredicable()) | 
|  | return true; | 
|  | return !isPredicated(MI); | 
|  | } | 
|  |  | 
|  |  | 
|  | /// Measure the specified inline asm to determine an approximation of its | 
|  | /// length. | 
|  | /// Comments (which run till the next SeparatorChar or newline) do not | 
|  | /// count as an instruction. | 
|  | /// Any other non-whitespace text is considered an instruction, with | 
|  | /// multiple instructions separated by SeparatorChar or newlines. | 
|  | /// Variable-length instructions are not handled here; this function | 
|  | /// may be overloaded in the target code to do that. | 
|  | unsigned TargetInstrInfo::getInlineAsmLength(const char *Str, | 
|  | const MCAsmInfo &MAI) const { | 
|  |  | 
|  |  | 
|  | // Count the number of instructions in the asm. | 
|  | bool atInsnStart = true; | 
|  | unsigned Length = 0; | 
|  | for (; *Str; ++Str) { | 
|  | if (*Str == '\n' || *Str == MAI.getSeparatorChar()) | 
|  | atInsnStart = true; | 
|  | if (atInsnStart && !isspace(*Str)) { | 
|  | Length += MAI.getMaxInstLength(); | 
|  | atInsnStart = false; | 
|  | } | 
|  | if (atInsnStart && strncmp(Str, MAI.getCommentString(), | 
|  | strlen(MAI.getCommentString())) == 0) | 
|  | atInsnStart = false; | 
|  | } | 
|  |  | 
|  | return Length; | 
|  | } |