Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: src/register-allocator.h

Issue 113455: Clean up the Result class. Reduce the size of Result from four words... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2008 the V8 project authors. All rights reserved. 1 // Copyright 2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 SMI_TYPE = 0x01, 96 SMI_TYPE = 0x01,
97 HEAP_OBJECT_TYPE = 0x02, 97 HEAP_OBJECT_TYPE = 0x02,
98 STRING_TYPE = 0x04 | HEAP_OBJECT_TYPE 98 STRING_TYPE = 0x04 | HEAP_OBJECT_TYPE
99 }; 99 };
100 explicit StaticType(StaticTypeEnum static_type) : static_type_(static_type) {} 100 explicit StaticType(StaticTypeEnum static_type) : static_type_(static_type) {}
101 101
102 // StaticTypeEnum static_type_; 102 // StaticTypeEnum static_type_;
103 StaticTypeEnum static_type_; 103 StaticTypeEnum static_type_;
104 104
105 friend class FrameElement; 105 friend class FrameElement;
106 friend class Result;
106 }; 107 };
107 108
108 109
109 // ------------------------------------------------------------------------- 110 // -------------------------------------------------------------------------
110 // Results 111 // Results
111 // 112 //
112 // Results encapsulate the compile-time values manipulated by the code 113 // Results encapsulate the compile-time values manipulated by the code
113 // generator. They can represent registers or constants. 114 // generator. They can represent registers or constants.
114 115
115 class Result BASE_EMBEDDED { 116 class Result BASE_EMBEDDED {
116 public: 117 public:
117 enum Type { 118 enum Type {
118 INVALID, 119 INVALID,
119 REGISTER, 120 REGISTER,
120 CONSTANT 121 CONSTANT
121 }; 122 };
122 123
123 // Construct an invalid result. 124 // Construct an invalid result.
124 explicit Result(CodeGenerator* cgen) 125 explicit Result() { invalidate(); }
Kevin Millikin (Chromium) 2009/05/15 10:50:49 Doesn't need explicit anymore.
Mads Ager (chromium) 2009/05/15 11:05:25 Done.
125 : static_type_(),
126 type_(INVALID),
127 cgen_(cgen) {}
128 126
129 // Construct a register Result. 127 // Construct a register Result.
130 Result(Register reg, 128 explicit Result(Register reg);
131 CodeGenerator* cgen);
132 129
133 // Construct a register Result with a known static type. 130 // Construct a register Result with a known static type.
134 Result(Register reg, 131 Result(Register reg, StaticType static_type);
135 CodeGenerator* cgen,
136 StaticType static_type);
137 132
138 // Construct a Result whose value is a compile-time constant. 133 // Construct a Result whose value is a compile-time constant.
139 Result(Handle<Object> value, CodeGenerator * cgen) 134 explicit Result(Handle<Object> value) {
140 : static_type_(StaticType::TypeOf(*value)), 135 value_ = StaticTypeField::encode(StaticType::TypeOf(*value).static_type_)
141 type_(CONSTANT), 136 | TypeField::encode(CONSTANT)
142 cgen_(cgen) { 137 | DataField::encode(ConstantList()->length());
143 data_.handle_ = value.location(); 138 ConstantList()->Add(value);
144 } 139 }
145 140
146 // The copy constructor and assignment operators could each create a new 141 // The copy constructor and assignment operators could each create a new
147 // register reference. 142 // register reference.
148 Result(const Result& other) { 143 Result(const Result& other) {
149 other.CopyTo(this); 144 other.CopyTo(this);
150 } 145 }
151 146
152 Result& operator=(const Result& other) { 147 Result& operator=(const Result& other) {
153 if (this != &other) { 148 if (this != &other) {
154 Unuse(); 149 Unuse();
155 other.CopyTo(this); 150 other.CopyTo(this);
156 } 151 }
157 return *this; 152 return *this;
158 } 153 }
159 154
160 inline ~Result(); 155 inline ~Result();
161 156
157 // Static indirection table for handles to constants. If a Result
158 // represents a constant, the data contains an index into this table
159 // of handles to the actual constants.
160 typedef ZoneList<Handle<Object> > ZoneObjectList;
161
162 static ZoneObjectList* ConstantList() {
163 static ZoneObjectList list(10);
164 return &list;
165 }
166
167 // Clear the constants indirection table.
168 static void ClearConstantList() {
169 ConstantList()->Clear();
170 }
171
162 inline void Unuse(); 172 inline void Unuse();
163 173
164 StaticType static_type() const { return static_type_; } 174 StaticType static_type() const {
165 void set_static_type(StaticType static_type) { static_type_ = static_type; } 175 return StaticType(StaticTypeField::decode(value_));
176 }
166 177
167 Type type() const { return static_cast<Type>(type_); } 178 void set_static_type(StaticType type) {
179 value_ = value_ & ~StaticTypeField::mask();
180 value_ = value_ | StaticTypeField::encode(type.static_type_);
181 }
182
183 Type type() const { return TypeField::decode(value_); }
184
185 void invalidate() { value_ = TypeField::encode(INVALID); }
168 186
169 bool is_valid() const { return type() != INVALID; } 187 bool is_valid() const { return type() != INVALID; }
170 bool is_register() const { return type() == REGISTER; } 188 bool is_register() const { return type() == REGISTER; }
171 bool is_constant() const { return type() == CONSTANT; } 189 bool is_constant() const { return type() == CONSTANT; }
172 190
173 Register reg() const { 191 Register reg() const {
174 ASSERT(type() == REGISTER); 192 ASSERT(is_register());
175 return data_.reg_; 193 uint32_t reg = DataField::decode(value_);
194 Register result;
195 result.code_ = reg;
196 return result;
176 } 197 }
177 198
178 Handle<Object> handle() const { 199 Handle<Object> handle() const {
179 ASSERT(type() == CONSTANT); 200 ASSERT(type() == CONSTANT);
180 return Handle<Object>(data_.handle_); 201 return ConstantList()->at(DataField::decode(value_));
181 } 202 }
182 203
183 // Move this result to an arbitrary register. The register is not 204 // Move this result to an arbitrary register. The register is not
184 // necessarily spilled from the frame or even singly-referenced outside 205 // necessarily spilled from the frame or even singly-referenced outside
185 // it. 206 // it.
186 void ToRegister(); 207 void ToRegister();
187 208
188 // Move this result to a specified register. The register is spilled from 209 // Move this result to a specified register. The register is spilled from
189 // the frame, and the register is singly-referenced (by this result) 210 // the frame, and the register is singly-referenced (by this result)
190 // outside the frame. 211 // outside the frame.
191 void ToRegister(Register reg); 212 void ToRegister(Register reg);
192 213
193 private: 214 private:
194 StaticType static_type_; 215 uint32_t value_;
195 byte type_;
196 216
197 union { 217 class StaticTypeField: public BitField<StaticType::StaticTypeEnum, 0, 3> {};
198 Register reg_; 218 class TypeField: public BitField<Type, 3, 2> {};
199 Object** handle_; 219 class DataField: public BitField<uint32_t, 5, 32 - 6> {};
200 } data_;
201 220
202 CodeGenerator* cgen_; 221 static CodeGenerator* cgen_;
203 222
204 void CopyTo(Result* destination) const; 223 inline void CopyTo(Result* destination) const;
224
225 friend class CodeGeneratorScope;
205 }; 226 };
206 227
207 228
208 // ------------------------------------------------------------------------- 229 // -------------------------------------------------------------------------
209 // Register file 230 // Register file
210 // 231 //
211 // The register file tracks reference counts for the processor registers. 232 // The register file tracks reference counts for the processor registers.
212 // It is used by both the register allocator and the virtual frame. 233 // It is used by both the register allocator and the virtual frame.
213 234
214 class RegisterFile BASE_EMBEDDED { 235 class RegisterFile BASE_EMBEDDED {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 } 356 }
336 357
337 private: 358 private:
338 CodeGenerator* cgen_; 359 CodeGenerator* cgen_;
339 RegisterFile registers_; 360 RegisterFile registers_;
340 }; 361 };
341 362
342 } } // namespace v8::internal 363 } } // namespace v8::internal
343 364
344 #endif // V8_REGISTER_ALLOCATOR_H_ 365 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698