blob: 03819099bf218810b5e4d1237f01c92cbcbdab65 [file] [log] [blame]
Vikram S. Advedaae6992001-07-21 12:42:08 +00001// $Id$
2//***************************************************************************
3// File:
4// TargetMachine.cpp
5//
6// Purpose:
7//
8// History:
9// 7/12/01 - Vikram Adve - Created
10//**************************************************************************/
11
12
Vikram S. Advedaae6992001-07-21 12:42:08 +000013//*************************** User Include Files ***************************/
14
Chris Lattner7e583cf2001-07-21 20:58:30 +000015#include "llvm/CodeGen/TargetMachine.h"
Chris Lattner68498ce2001-07-21 23:24:48 +000016#include "llvm/DerivedTypes.h"
Vikram S. Advedaae6992001-07-21 12:42:08 +000017
Vikram S. Adve44a853c2001-07-28 04:09:37 +000018//************************ Exported Constants ******************************/
19
20
21// External object describing the machine instructions
22// Initialized only when the TargetMachine class is created
23// and reset when that class is destroyed.
24//
25const MachineInstrDescriptor* TargetInstrDescriptors = NULL;
26
Vikram S. Advedaae6992001-07-21 12:42:08 +000027
28//************************ Class Implementations **************************/
29
Vikram S. Advedaae6992001-07-21 12:42:08 +000030//---------------------------------------------------------------------------
Vikram S. Adve44a853c2001-07-28 04:09:37 +000031// class TargetMachine
Vikram S. Advedaae6992001-07-21 12:42:08 +000032//
33// Purpose:
Vikram S. Adve44a853c2001-07-28 04:09:37 +000034// Machine description.
35//
Vikram S. Advedaae6992001-07-21 12:42:08 +000036//---------------------------------------------------------------------------
37
Vikram S. Adve44a853c2001-07-28 04:09:37 +000038
39// function TargetMachine::findOptimalStorageSize
40//
41// Purpose:
42// Compute optimal storage size for a structure, based on
43// the optimal member offsets.
44// This default implementation assumes that all sub-word data items use
45// space equal to optSizeForSubWordData, and all other primitive data
46// items use space according to the type.
47//
Vikram S. Advedaae6992001-07-21 12:42:08 +000048unsigned int
49TargetMachine::findOptimalStorageSize(const Type* ty) const
50{
51 switch(ty->getPrimitiveID())
52 {
53 case Type::BoolTyID:
54 case Type::UByteTyID: case Type::SByteTyID:
55 case Type::UShortTyID: case Type::ShortTyID:
56 return optSizeForSubWordData;
57 break;
58
59 case Type::UIntTyID: case Type::IntTyID:
60 return intSize;
61 break;
62
63 case Type::FloatTyID:
64 return floatSize;
65 break;
66
67 case Type::ULongTyID: case Type::LongTyID:
68 return longSize;
69 break;
70
71 case Type::DoubleTyID:
72 return doubleSize;
73 break;
74
75 case Type::PointerTyID:
76 case Type::LabelTyID: case Type::MethodTyID:
77 return pointerSize;
78 break;
79
80 case Type::ArrayTyID:
81 {
82 ArrayType* aty = (ArrayType*) ty;
83 assert(aty->getNumElements() >= 0 &&
84 "Attempting to compute size for unknown-size array");
85 return (unsigned) aty->getNumElements() *
86 this->findOptimalStorageSize(aty->getElementType());
87 break;
88 }
89
90 case Type::StructTyID:
91 {// This code should be invoked only from StructType::getStorageSize().
92 StructType* sty = (StructType*) ty;
93 unsigned lastMemberIdx = sty->getElementTypes().size() - 1;
94 unsigned lastMemberOffset = sty->getElementOffset(lastMemberIdx, *this);
95 unsigned storageSize = lastMemberOffset
96 + this->findOptimalStorageSize(sty->getElementTypes()[lastMemberIdx]);
97 return storageSize;
98 break;
99 }
100
101 default:
102 assert(0 && "Unexpected type in `findOptimalStorageSize'");
103 return 0;
104 break;
105 }
106}
107
Vikram S. Adve44a853c2001-07-28 04:09:37 +0000108
109// function TargetMachine::findOptimalMemberOffsets
110//
111// Purpose:
112// Compute optimal offsets for the members of a structure.
113// Returns a vector of unsigned ints, one per member.
114// Caller is responsible for freeing the vector.
115
Vikram S. Advedaae6992001-07-21 12:42:08 +0000116unsigned int*
117TargetMachine::findOptimalMemberOffsets(const StructType* stype) const
118{
119 int numMembers = stype->getElementTypes().size();
120 unsigned int* offsetVec = new unsigned int[numMembers];
121 unsigned int netOffset = 0;
122 for (int i = 0; i < numMembers; i++)
123 {
124 offsetVec[i] = netOffset;
125 const Type* memberType = stype->getElementTypes()[i];
126 netOffset += this->findOptimalStorageSize(memberType);
127 }
128 return offsetVec;
129}
130
Vikram S. Adve44a853c2001-07-28 04:09:37 +0000131
132//---------------------------------------------------------------------------
133// class MachineInstructionInfo
134// Interface to description of machine instructions
135//---------------------------------------------------------------------------
136
137
138/*ctor*/
139MachineInstrInfo::MachineInstrInfo(const MachineInstrDescriptor* _desc,
140 unsigned int _descSize)
141 : desc(_desc), descSize(_descSize)
142{
143 assert(TargetInstrDescriptors == NULL && desc != NULL);
144 TargetInstrDescriptors = desc; // initialize global variable
145}
146
147
148/*dtor*/
149MachineInstrInfo::~MachineInstrInfo()
150{
151 TargetInstrDescriptors = NULL; // reset global variable
152}
153
154
155bool
156MachineInstrInfo::constantFitsInImmedField(MachineOpCode opCode,
157 int64_t intValue) const
158{
159 // First, check if opCode has an immed field.
160 bool isSignExtended;
161 uint64_t maxImmedValue = this->maxImmedConstant(opCode, isSignExtended);
162 if (maxImmedValue != 0)
163 {
164 // Now check if the constant fits
165 if (intValue <= (int64_t) maxImmedValue &&
166 intValue >= -((int64_t) maxImmedValue+1))
167 return true;
168 }
169
170 return false;
171}
172
Vikram S. Advedaae6992001-07-21 12:42:08 +0000173//---------------------------------------------------------------------------