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

Side by Side Diff: src/arm/codegen-arm.h

Issue 2452002: ARM: Track Smis on top 4 stack positions and Smi loop variables.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 6 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
« no previous file with comments | « no previous file | src/arm/codegen-arm.cc » ('j') | src/arm/codegen-arm.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 25 matching lines...) Expand all
36 36
37 // Forward declarations 37 // Forward declarations
38 class CompilationInfo; 38 class CompilationInfo;
39 class DeferredCode; 39 class DeferredCode;
40 class JumpTarget; 40 class JumpTarget;
41 class RegisterAllocator; 41 class RegisterAllocator;
42 class RegisterFile; 42 class RegisterFile;
43 43
44 enum InitState { CONST_INIT, NOT_CONST_INIT }; 44 enum InitState { CONST_INIT, NOT_CONST_INIT };
45 enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF }; 45 enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
46 enum GenerateInlineSmi { DONT_GENERATE_INLINE_SMI, GENERATE_INLINE_SMI };
46 47
47 48
48 // ------------------------------------------------------------------------- 49 // -------------------------------------------------------------------------
49 // Reference support 50 // Reference support
50 51
51 // A reference is a C++ stack-allocated object that puts a 52 // A reference is a C++ stack-allocated object that puts a
52 // reference on the virtual frame. The reference may be consumed 53 // reference on the virtual frame. The reference may be consumed
53 // by GetValue, TakeValue, SetValue, and Codegen::UnloadReference. 54 // by GetValue, TakeValue, SetValue, and Codegen::UnloadReference.
54 // When the lifetime (scope) of a valid reference ends, it must have 55 // When the lifetime (scope) of a valid reference ends, it must have
55 // been consumed, and be in state UNLOADED. 56 // been consumed, and be in state UNLOADED.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 // the form of the state of the label pair). It is threaded through the 123 // the form of the state of the label pair). It is threaded through the
123 // call stack. Constructing a state implicitly pushes it on the owning code 124 // call stack. Constructing a state implicitly pushes it on the owning code
124 // generator's stack of states, and destroying one implicitly pops it. 125 // generator's stack of states, and destroying one implicitly pops it.
125 126
126 class CodeGenState BASE_EMBEDDED { 127 class CodeGenState BASE_EMBEDDED {
127 public: 128 public:
128 // Create an initial code generator state. Destroying the initial state 129 // Create an initial code generator state. Destroying the initial state
129 // leaves the code generator with a NULL state. 130 // leaves the code generator with a NULL state.
130 explicit CodeGenState(CodeGenerator* owner); 131 explicit CodeGenState(CodeGenerator* owner);
131 132
132 // Create a code generator state based on a code generator's current
133 // state. The new state has its own pair of branch labels.
134 CodeGenState(CodeGenerator* owner,
135 JumpTarget* true_target,
136 JumpTarget* false_target);
137
138 // Destroy a code generator state and restore the owning code generator's 133 // Destroy a code generator state and restore the owning code generator's
139 // previous state. 134 // previous state.
140 ~CodeGenState(); 135 virtual ~CodeGenState();
141 136
142 JumpTarget* true_target() const { return true_target_; } 137 virtual JumpTarget* true_target() const { return NULL; }
143 JumpTarget* false_target() const { return false_target_; } 138 virtual JumpTarget* false_target() const { return NULL; }
139
140 protected:
141 inline CodeGenerator* owner() { return owner_; }
142 inline CodeGenState* previous() const { return previous_; }
144 143
145 private: 144 private:
146 CodeGenerator* owner_; 145 CodeGenerator* owner_;
146 CodeGenState* previous_;
147 };
148
149
150 class ConditionCodeGenState : public CodeGenState {
151 public:
152 // Create a code generator state based on a code generator's current
153 // state. The new state has its own pair of branch labels.
154 ConditionCodeGenState(CodeGenerator* owner,
155 JumpTarget* true_target,
156 JumpTarget* false_target);
157
158 virtual JumpTarget* true_target() const { return true_target_; }
159 virtual JumpTarget* false_target() const { return false_target_; }
160
161 private:
147 JumpTarget* true_target_; 162 JumpTarget* true_target_;
148 JumpTarget* false_target_; 163 JumpTarget* false_target_;
149 CodeGenState* previous_; 164 };
165
166
167 class TypeInfoCodeGenState : public CodeGenState {
168 public:
169 TypeInfoCodeGenState(CodeGenerator* owner,
170 Slot* slot_number,
171 TypeInfo info);
172 ~TypeInfoCodeGenState();
173
174 virtual JumpTarget* true_target() const { return previous()->true_target(); }
175 virtual JumpTarget* false_target() const {
176 return previous()->false_target();
177 }
178
179 private:
180 Slot* slot_;
181 TypeInfo old_type_info_;
150 }; 182 };
151 183
152 184
153 // ------------------------------------------------------------------------- 185 // -------------------------------------------------------------------------
154 // Arguments allocation mode 186 // Arguments allocation mode
155 187
156 enum ArgumentsAllocationMode { 188 enum ArgumentsAllocationMode {
157 NO_ARGUMENTS_ALLOCATION, 189 NO_ARGUMENTS_ALLOCATION,
158 EAGER_ARGUMENTS_ALLOCATION, 190 EAGER_ARGUMENTS_ALLOCATION,
159 LAZY_ARGUMENTS_ALLOCATION 191 LAZY_ARGUMENTS_ALLOCATION
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 // non_frame_registers. 241 // non_frame_registers.
210 void SetFrame(VirtualFrame* new_frame, RegisterFile* non_frame_registers); 242 void SetFrame(VirtualFrame* new_frame, RegisterFile* non_frame_registers);
211 243
212 void DeleteFrame(); 244 void DeleteFrame();
213 245
214 RegisterAllocator* allocator() const { return allocator_; } 246 RegisterAllocator* allocator() const { return allocator_; }
215 247
216 CodeGenState* state() { return state_; } 248 CodeGenState* state() { return state_; }
217 void set_state(CodeGenState* state) { state_ = state; } 249 void set_state(CodeGenState* state) { state_ = state; }
218 250
251 TypeInfo type_info(Slot* slot) {
252 int index = NumberOfSlot(slot);
253 if (index == kInvalidSlotNumber) return TypeInfo::Unknown();
254 return (*type_info_)[index];
255 }
256
257 TypeInfo set_type_info(Slot* slot, TypeInfo info) {
258 int index = NumberOfSlot(slot);
259 ASSERT(index >= kInvalidSlotNumber);
260 if (index != kInvalidSlotNumber) {
261 TypeInfo previous_value = (*type_info_)[index];
262 (*type_info_)[index] = info;
263 return previous_value;
264 }
265 return TypeInfo::Unknown();
266 }
267
219 void AddDeferred(DeferredCode* code) { deferred_.Add(code); } 268 void AddDeferred(DeferredCode* code) { deferred_.Add(code); }
220 269
221 static const int kUnknownIntValue = -1; 270 static const int kUnknownIntValue = -1;
222 271
223 // If the name is an inline runtime function call return the number of 272 // If the name is an inline runtime function call return the number of
224 // expected arguments. Otherwise return -1. 273 // expected arguments. Otherwise return -1.
225 static int InlineRuntimeCallArgumentsCount(Handle<String> name); 274 static int InlineRuntimeCallArgumentsCount(Handle<String> name);
226 275
227 // Constants related to patching of inlined load/store. 276 // Constants related to patching of inlined load/store.
228 static const int kInlinedKeyedLoadInstructionsAfterPatch = 19; 277 static const int kInlinedKeyedLoadInstructionsAfterPatch = 17;
229 static const int kInlinedKeyedStoreInstructionsAfterPatch = 5; 278 static const int kInlinedKeyedStoreInstructionsAfterPatch = 5;
230 279
231 private: 280 private:
232 // Construction/Destruction 281 // Construction/Destruction
233 explicit CodeGenerator(MacroAssembler* masm); 282 explicit CodeGenerator(MacroAssembler* masm);
234 283
235 // Accessors 284 // Accessors
236 inline bool is_eval(); 285 inline bool is_eval();
237 inline Scope* scope(); 286 inline Scope* scope();
238 287
239 // Generating deferred code. 288 // Generating deferred code.
240 void ProcessDeferred(); 289 void ProcessDeferred();
241 290
291 static const int kInvalidSlotNumber = -1;
292
293 int NumberOfSlot(Slot* slot);
294
242 // State 295 // State
243 bool has_cc() const { return cc_reg_ != al; } 296 bool has_cc() const { return cc_reg_ != al; }
244 JumpTarget* true_target() const { return state_->true_target(); } 297 JumpTarget* true_target() const { return state_->true_target(); }
245 JumpTarget* false_target() const { return state_->false_target(); } 298 JumpTarget* false_target() const { return state_->false_target(); }
246 299
247 // Track loop nesting level. 300 // Track loop nesting level.
248 int loop_nesting() const { return loop_nesting_; } 301 int loop_nesting() const { return loop_nesting_; }
249 void IncrementLoopNesting() { loop_nesting_++; } 302 void IncrementLoopNesting() { loop_nesting_++; }
250 void DecrementLoopNesting() { loop_nesting_--; } 303 void DecrementLoopNesting() { loop_nesting_--; }
251 304
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 // non-existing properties of the global object, so we must make it 395 // non-existing properties of the global object, so we must make it
343 // look like an explicit property access, instead of an access 396 // look like an explicit property access, instead of an access
344 // through the context chain. 397 // through the context chain.
345 void LoadTypeofExpression(Expression* x); 398 void LoadTypeofExpression(Expression* x);
346 399
347 void ToBoolean(JumpTarget* true_target, JumpTarget* false_target); 400 void ToBoolean(JumpTarget* true_target, JumpTarget* false_target);
348 401
349 // Generate code that computes a shortcutting logical operation. 402 // Generate code that computes a shortcutting logical operation.
350 void GenerateLogicalBooleanOperation(BinaryOperation* node); 403 void GenerateLogicalBooleanOperation(BinaryOperation* node);
351 404
352 void GenericBinaryOperation(Token::Value op,
353 OverwriteMode overwrite_mode,
354 int known_rhs = kUnknownIntValue);
355 void VirtualFrameBinaryOperation(Token::Value op, 405 void VirtualFrameBinaryOperation(Token::Value op,
356 OverwriteMode overwrite_mode, 406 OverwriteMode overwrite_mode,
407 GenerateInlineSmi inline_smi,
357 int known_rhs = kUnknownIntValue); 408 int known_rhs = kUnknownIntValue);
358 void Comparison(Condition cc, 409 void Comparison(Condition cc,
359 Expression* left, 410 Expression* left,
360 Expression* right, 411 Expression* right,
361 bool strict = false); 412 bool strict = false);
362 413
363 void SmiOperation(Token::Value op, 414 void SmiOperation(Token::Value op,
364 Handle<Object> value, 415 Handle<Object> value,
365 bool reversed, 416 bool reversed,
366 OverwriteMode mode); 417 OverwriteMode mode);
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 555
505 CompilationInfo* info_; 556 CompilationInfo* info_;
506 557
507 // Code generation state 558 // Code generation state
508 VirtualFrame* frame_; 559 VirtualFrame* frame_;
509 RegisterAllocator* allocator_; 560 RegisterAllocator* allocator_;
510 Condition cc_reg_; 561 Condition cc_reg_;
511 CodeGenState* state_; 562 CodeGenState* state_;
512 int loop_nesting_; 563 int loop_nesting_;
513 564
565 Vector<TypeInfo>* type_info_;
566
514 // Jump targets 567 // Jump targets
515 BreakTarget function_return_; 568 BreakTarget function_return_;
516 569
517 // True if the function return is shadowed (ie, jumping to the target 570 // True if the function return is shadowed (ie, jumping to the target
518 // function_return_ does not jump to the true function return, but rather 571 // function_return_ does not jump to the true function return, but rather
519 // to some unlinking code). 572 // to some unlinking code).
520 bool function_return_is_shadowed_; 573 bool function_return_is_shadowed_;
521 574
522 static InlineRuntimeLUT kInlineRuntimeLUT[]; 575 static InlineRuntimeLUT kInlineRuntimeLUT[];
523 576
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 return ObjectBits::encode(object_.code()) | 959 return ObjectBits::encode(object_.code()) |
907 OffsetBits::encode(offset_.code()) | 960 OffsetBits::encode(offset_.code()) |
908 ScratchBits::encode(scratch_.code()); 961 ScratchBits::encode(scratch_.code());
909 } 962 }
910 }; 963 };
911 964
912 965
913 } } // namespace v8::internal 966 } } // namespace v8::internal
914 967
915 #endif // V8_ARM_CODEGEN_ARM_H_ 968 #endif // V8_ARM_CODEGEN_ARM_H_
OLDNEW
« no previous file with comments | « no previous file | src/arm/codegen-arm.cc » ('j') | src/arm/codegen-arm.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698