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