1 //===-- TargetMachine.cpp - General Target Information ---------------------==// 2 // 3 // This file describes the general parts of a Target machine. 4 // This file also implements the InstInfo interface as well... 5 // 6 //===----------------------------------------------------------------------===// 7 8 #include "llvm/Target/MachineInstrInfo.h" 9 #include "llvm/DerivedTypes.h" 10 11 //--------------------------------------------------------------------------- 12 // class TargetMachine 13 // 14 // Purpose: 15 // Machine description. 16 // 17 //--------------------------------------------------------------------------- 18 19 20 // function TargetMachine::findOptimalStorageSize 21 // 22 // Purpose: 23 // This default implementation assumes that all sub-word data items use 24 // space equal to optSizeForSubWordData, and all other primitive data 25 // items use space according to the type. 26 // 27 unsigned int 28 TargetMachine::findOptimalStorageSize(const Type* ty) const 29 { 30 switch(ty->getPrimitiveID()) 31 { 32 case Type::BoolTyID: 33 case Type::UByteTyID: 34 case Type::SByteTyID: 35 case Type::UShortTyID: 36 case Type::ShortTyID: 37 return optSizeForSubWordData; 38 39 default: 40 return DataLayout.getTypeSize(ty); 41 } 42 } 43 44 45 //--------------------------------------------------------------------------- 46 // class MachineInstructionInfo 47 // Interface to description of machine instructions 48 //--------------------------------------------------------------------------- 49 50 51 /*ctor*/ 52 MachineInstrInfo::MachineInstrInfo(const MachineInstrDescriptor* _desc, 53 unsigned int _descSize, 54 unsigned int _numRealOpCodes) 55 : desc(_desc), descSize(_descSize), numRealOpCodes(_numRealOpCodes) 56 { 57 // FIXME: TargetInstrDescriptors should not be global 58 assert(TargetInstrDescriptors == NULL && desc != NULL); 59 TargetInstrDescriptors = desc; // initialize global variable 60 } 61 62 63 MachineInstrInfo::~MachineInstrInfo() 64 { 65 TargetInstrDescriptors = NULL; // reset global variable 66 } 67 68 69 bool 70 MachineInstrInfo::constantFitsInImmedField(MachineOpCode opCode, 71 int64_t intValue) const 72 { 73 // First, check if opCode has an immed field. 74 bool isSignExtended; 75 uint64_t maxImmedValue = maxImmedConstant(opCode, isSignExtended); 76 if (maxImmedValue != 0) 77 { 78 // Now check if the constant fits 79 if (intValue <= (int64_t) maxImmedValue && 80 intValue >= -((int64_t) maxImmedValue+1)) 81 return true; 82 } 83 84 return false; 85 } 86