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

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

Issue 6759025: Version 3.2.6 (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 9 years, 8 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 | « src/mips/code-stubs-mips.cc ('k') | src/mips/codegen-mips.cc » ('j') | no next file with comments »
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 11 matching lines...) Expand all
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 28
29 #ifndef V8_MIPS_CODEGEN_MIPS_H_ 29 #ifndef V8_MIPS_CODEGEN_MIPS_H_
30 #define V8_MIPS_CODEGEN_MIPS_H_ 30 #define V8_MIPS_CODEGEN_MIPS_H_
31 31
32
33 #include "ast.h"
34 #include "code-stubs-mips.h"
35 #include "ic-inl.h"
36
32 namespace v8 { 37 namespace v8 {
33 namespace internal { 38 namespace internal {
34 39
40 #if(defined(__mips_hard_float) && __mips_hard_float != 0)
41 // Use floating-point coprocessor instructions. This flag is raised when
42 // -mhard-float is passed to the compiler.
43 static const bool IsMipsSoftFloatABI = false;
44 #elif(defined(__mips_soft_float) && __mips_soft_float != 0)
45 // Not using floating-point coprocessor instructions. This flag is raised when
46 // -msoft-float is passed to the compiler.
47 static const bool IsMipsSoftFloatABI = true;
48 #else
49 static const bool IsMipsSoftFloatABI = true;
50 #endif
51
35 // Forward declarations 52 // Forward declarations
36 class CompilationInfo; 53 class CompilationInfo;
37 class DeferredCode; 54 class DeferredCode;
55 class JumpTarget;
38 class RegisterAllocator; 56 class RegisterAllocator;
39 class RegisterFile; 57 class RegisterFile;
40 58
41 enum InitState { CONST_INIT, NOT_CONST_INIT }; 59 enum InitState { CONST_INIT, NOT_CONST_INIT };
42 enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF }; 60 enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
61 enum GenerateInlineSmi { DONT_GENERATE_INLINE_SMI, GENERATE_INLINE_SMI };
62 enum WriteBarrierCharacter { UNLIKELY_SMI, LIKELY_SMI, NEVER_NEWSPACE };
43 63
44 64
45 // ----------------------------------------------------------------------------- 65 // -----------------------------------------------------------------------------
46 // Reference support 66 // Reference support
47 67
48 // A reference is a C++ stack-allocated object that keeps an ECMA 68 // A reference is a C++ stack-allocated object that keeps an ECMA
49 // reference on the execution stack while in scope. For variables 69 // reference on the execution stack while in scope. For variables
50 // the reference is empty, indicating that it isn't necessary to 70 // the reference is empty, indicating that it isn't necessary to
51 // store state on the stack for keeping track of references to those. 71 // store state on the stack for keeping track of references to those.
52 // For properties, we keep either one (named) or two (indexed) values 72 // For properties, we keep either one (named) or two (indexed) values
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 114
95 // Generate code to pop a reference, push the value of the reference, 115 // Generate code to pop a reference, push the value of the reference,
96 // and then spill the stack frame. 116 // and then spill the stack frame.
97 inline void GetValueAndSpill(); 117 inline void GetValueAndSpill();
98 118
99 // Generate code to store the value on top of the expression stack in the 119 // Generate code to store the value on top of the expression stack in the
100 // reference. The reference is expected to be immediately below the value 120 // reference. The reference is expected to be immediately below the value
101 // on the expression stack. The value is stored in the location specified 121 // on the expression stack. The value is stored in the location specified
102 // by the reference, and is left on top of the stack, after the reference 122 // by the reference, and is left on top of the stack, after the reference
103 // is popped from beneath it (unloaded). 123 // is popped from beneath it (unloaded).
104 void SetValue(InitState init_state); 124 void SetValue(InitState init_state, WriteBarrierCharacter wb);
125
126 // This is in preparation for something that uses the reference on the stack.
127 // If we need this reference afterwards get then dup it now. Otherwise mark
128 // it as used.
129 inline void DupIfPersist();
105 130
106 private: 131 private:
107 CodeGenerator* cgen_; 132 CodeGenerator* cgen_;
108 Expression* expression_; 133 Expression* expression_;
109 Type type_; 134 Type type_;
110 // Keep the reference on the stack after get, so it can be used by set later. 135 // Keep the reference on the stack after get, so it can be used by set later.
111 bool persist_after_get_; 136 bool persist_after_get_;
112 }; 137 };
113 138
114 139
115 // ----------------------------------------------------------------------------- 140 // -----------------------------------------------------------------------------
116 // Code generation state 141 // Code generation state
117 142
118 // The state is passed down the AST by the code generator (and back up, in 143 // The state is passed down the AST by the code generator (and back up, in
119 // the form of the state of the label pair). It is threaded through the 144 // the form of the state of the label pair). It is threaded through the
120 // call stack. Constructing a state implicitly pushes it on the owning code 145 // call stack. Constructing a state implicitly pushes it on the owning code
121 // generator's stack of states, and destroying one implicitly pops it. 146 // generator's stack of states, and destroying one implicitly pops it.
122 147
123 class CodeGenState BASE_EMBEDDED { 148 class CodeGenState BASE_EMBEDDED {
124 public: 149 public:
125 // Create an initial code generator state. Destroying the initial state 150 // Create an initial code generator state. Destroying the initial state
126 // leaves the code generator with a NULL state. 151 // leaves the code generator with a NULL state.
127 explicit CodeGenState(CodeGenerator* owner); 152 explicit CodeGenState(CodeGenerator* owner);
128 153
129 // Create a code generator state based on a code generator's current 154
130 // state. The new state has its own typeof state and pair of branch
131 // labels.
132 CodeGenState(CodeGenerator* owner,
133 JumpTarget* true_target,
134 JumpTarget* false_target);
135 155
136 // Destroy a code generator state and restore the owning code generator's 156 // Destroy a code generator state and restore the owning code generator's
137 // previous state. 157 // previous state.
138 ~CodeGenState(); 158 virtual ~CodeGenState();
139 159
140 TypeofState typeof_state() const { return typeof_state_; } 160 virtual JumpTarget* true_target() const { return NULL; }
141 JumpTarget* true_target() const { return true_target_; } 161 virtual JumpTarget* false_target() const { return NULL; }
142 JumpTarget* false_target() const { return false_target_; } 162
163 protected:
164 inline CodeGenerator* owner() { return owner_; }
165 inline CodeGenState* previous() const { return previous_; }
143 166
144 private: 167 private:
145 // The owning code generator. 168 // The owning code generator.
146 CodeGenerator* owner_; 169 CodeGenerator* owner_;
147 170
148 // A flag indicating whether we are compiling the immediate subexpression
149 // of a typeof expression.
150 TypeofState typeof_state_;
151 171
152 JumpTarget* true_target_;
153 JumpTarget* false_target_;
154 172
155 // The previous state of the owning code generator, restored when 173 // The previous state of the owning code generator, restored when
156 // this state is destroyed. 174 // this state is destroyed.
157 CodeGenState* previous_; 175 CodeGenState* previous_;
158 }; 176 };
159 177
160 178
179 class ConditionCodeGenState : public CodeGenState {
180 public:
181 // Create a code generator state based on a code generator's current
182 // state. The new state has its own pair of branch labels.
183 ConditionCodeGenState(CodeGenerator* owner,
184 JumpTarget* true_target,
185 JumpTarget* false_target);
186
187 virtual JumpTarget* true_target() const { return true_target_; }
188 virtual JumpTarget* false_target() const { return false_target_; }
189
190 private:
191 JumpTarget* true_target_;
192 JumpTarget* false_target_;
193 };
194
195
196 class TypeInfoCodeGenState : public CodeGenState {
197 public:
198 TypeInfoCodeGenState(CodeGenerator* owner,
199 Slot* slot_number,
200 TypeInfo info);
201 virtual ~TypeInfoCodeGenState();
202
203 virtual JumpTarget* true_target() const { return previous()->true_target(); }
204 virtual JumpTarget* false_target() const {
205 return previous()->false_target();
206 }
207
208 private:
209 Slot* slot_;
210 TypeInfo old_type_info_;
211 };
212
213
214 // -------------------------------------------------------------------------
215 // Arguments allocation mode
216
217 enum ArgumentsAllocationMode {
218 NO_ARGUMENTS_ALLOCATION,
219 EAGER_ARGUMENTS_ALLOCATION,
220 LAZY_ARGUMENTS_ALLOCATION
221 };
222
161 223
162 // ----------------------------------------------------------------------------- 224 // -----------------------------------------------------------------------------
163 // CodeGenerator 225 // CodeGenerator
164 226
165 class CodeGenerator: public AstVisitor { 227 class CodeGenerator: public AstVisitor {
166 public: 228 public:
167 // Compilation mode. Either the compiler is used as the primary 229 // Compilation mode. Either the compiler is used as the primary
168 // compiler and needs to setup everything or the compiler is used as 230 // compiler and needs to setup everything or the compiler is used as
169 // the secondary compiler for split compilation and has to handle 231 // the secondary compiler for split compilation and has to handle
170 // bailouts. 232 // bailouts.
171 enum Mode { 233 enum Mode {
172 PRIMARY, 234 PRIMARY,
173 SECONDARY 235 SECONDARY
174 }; 236 };
175 237
176 // Takes a function literal, generates code for it. This function should only 238 static bool MakeCode(CompilationInfo* info);
177 // be called by compiler.cc.
178 static Handle<Code> MakeCode(CompilationInfo* info);
179 239
180 // Printing of AST, etc. as requested by flags. 240 // Printing of AST, etc. as requested by flags.
181 static void MakeCodePrologue(CompilationInfo* info); 241 static void MakeCodePrologue(CompilationInfo* info);
182 242
183 // Allocate and install the code. 243 // Allocate and install the code.
184 static Handle<Code> MakeCodeEpilogue(MacroAssembler* masm, 244 static Handle<Code> MakeCodeEpilogue(MacroAssembler* masm,
185 Code::Flags flags, 245 Code::Flags flags,
186 CompilationInfo* info); 246 CompilationInfo* info);
187 247
248 // Print the code after compiling it.
249 static void PrintCode(Handle<Code> code, CompilationInfo* info);
250
188 #ifdef ENABLE_LOGGING_AND_PROFILING 251 #ifdef ENABLE_LOGGING_AND_PROFILING
189 static bool ShouldGenerateLog(Expression* type); 252 static bool ShouldGenerateLog(Expression* type);
190 #endif 253 #endif
191 254
192 static void SetFunctionInfo(Handle<JSFunction> fun, 255 static void SetFunctionInfo(Handle<JSFunction> fun,
193 FunctionLiteral* lit, 256 FunctionLiteral* lit,
194 bool is_toplevel, 257 bool is_toplevel,
195 Handle<Script> script); 258 Handle<Script> script);
196 259
197 static void RecordPositions(MacroAssembler* masm, int pos); 260 static bool RecordPositions(MacroAssembler* masm,
261 int pos,
262 bool right_here = false);
198 263
199 // Accessors 264 // Accessors
200 MacroAssembler* masm() { return masm_; } 265 MacroAssembler* masm() { return masm_; }
201 VirtualFrame* frame() const { return frame_; } 266 VirtualFrame* frame() const { return frame_; }
202 inline Handle<Script> script(); 267 inline Handle<Script> script();
203 268
204 bool has_valid_frame() const { return frame_ != NULL; } 269 bool has_valid_frame() const { return frame_ != NULL; }
205 270
206 // Set the virtual frame to be new_frame, with non-frame register 271 // Set the virtual frame to be new_frame, with non-frame register
207 // reference counts given by non_frame_registers. The non-frame 272 // reference counts given by non_frame_registers. The non-frame
208 // register reference counts of the old frame are returned in 273 // register reference counts of the old frame are returned in
209 // non_frame_registers. 274 // non_frame_registers.
210 void SetFrame(VirtualFrame* new_frame, RegisterFile* non_frame_registers); 275 void SetFrame(VirtualFrame* new_frame, RegisterFile* non_frame_registers);
211 276
212 void DeleteFrame(); 277 void DeleteFrame();
213 278
214 RegisterAllocator* allocator() const { return allocator_; } 279 RegisterAllocator* allocator() const { return allocator_; }
215 280
216 CodeGenState* state() { return state_; } 281 CodeGenState* state() { return state_; }
217 void set_state(CodeGenState* state) { state_ = state; } 282 void set_state(CodeGenState* state) { state_ = state; }
218 283
284 TypeInfo type_info(Slot* slot) {
285 int index = NumberOfSlot(slot);
286 if (index == kInvalidSlotNumber) return TypeInfo::Unknown();
287 return (*type_info_)[index];
288 }
289
290 TypeInfo set_type_info(Slot* slot, TypeInfo info) {
291 int index = NumberOfSlot(slot);
292 ASSERT(index >= kInvalidSlotNumber);
293 if (index != kInvalidSlotNumber) {
294 TypeInfo previous_value = (*type_info_)[index];
295 (*type_info_)[index] = info;
296 return previous_value;
297 }
298 return TypeInfo::Unknown();
299 }
219 void AddDeferred(DeferredCode* code) { deferred_.Add(code); } 300 void AddDeferred(DeferredCode* code) { deferred_.Add(code); }
220 301
221 static const int kUnknownIntValue = -1; 302 // Constants related to patching of inlined load/store.
222 303 static int GetInlinedKeyedLoadInstructionsAfterPatch() {
223 // Number of instructions used for the JS return sequence. The constant is 304 // This is in correlation with the padding in MacroAssembler::Abort.
224 // used by the debugger to patch the JS return sequence. 305 return FLAG_debug_code ? 45 : 20;
225 static const int kJSReturnSequenceLength = 7; 306 }
226 307 static const int kInlinedKeyedStoreInstructionsAfterPatch = 9;
227 // If the name is an inline runtime function call return the number of 308 static int GetInlinedNamedStoreInstructionsAfterPatch() {
228 // expected arguments. Otherwise return -1. 309 ASSERT(Isolate::Current()->inlined_write_barrier_size() != -1);
229 static int InlineRuntimeCallArgumentsCount(Handle<String> name); 310 // Magic number 5: instruction count after patched map load:
311 // li: 2 (liu & ori), Branch : 2 (bne & nop), sw : 1
312 return Isolate::Current()->inlined_write_barrier_size() + 5;
313 }
230 314
231 private: 315 private:
316 // Type of a member function that generates inline code for a native function.
317 typedef void (CodeGenerator::*InlineFunctionGenerator)
318 (ZoneList<Expression*>*);
319
320 static const InlineFunctionGenerator kInlineFunctionGenerators[];
321
322
232 // Construction/Destruction. 323 // Construction/Destruction.
233 explicit CodeGenerator(MacroAssembler* masm); 324 explicit CodeGenerator(MacroAssembler* masm);
234 325
235 // Accessors. 326 // Accessors.
236 inline bool is_eval(); 327 inline bool is_eval();
237 inline Scope* scope(); 328 inline Scope* scope();
329 inline bool is_strict_mode();
330 inline StrictModeFlag strict_mode_flag();
238 331
239 // Generating deferred code. 332 // Generating deferred code.
240 void ProcessDeferred(); 333 void ProcessDeferred();
241 334
335 static const int kInvalidSlotNumber = -1;
336
337 int NumberOfSlot(Slot* slot);
242 // State 338 // State
243 bool has_cc() const { return cc_reg_ != cc_always; } 339 bool has_cc() const { return cc_reg_ != cc_always; }
244 TypeofState typeof_state() const { return state_->typeof_state(); } 340
245 JumpTarget* true_target() const { return state_->true_target(); } 341 JumpTarget* true_target() const { return state_->true_target(); }
246 JumpTarget* false_target() const { return state_->false_target(); } 342 JumpTarget* false_target() const { return state_->false_target(); }
247 343
248 // We don't track loop nesting level on mips yet. 344 // Track loop nesting level.
249 int loop_nesting() const { return 0; } 345 int loop_nesting() const { return loop_nesting_; }
346 void IncrementLoopNesting() { loop_nesting_++; }
347 void DecrementLoopNesting() { loop_nesting_--; }
250 348
251 // Node visitors. 349 // Node visitors.
252 void VisitStatements(ZoneList<Statement*>* statements); 350 void VisitStatements(ZoneList<Statement*>* statements);
253 351
352 virtual void VisitSlot(Slot* node);
254 #define DEF_VISIT(type) \ 353 #define DEF_VISIT(type) \
255 void Visit##type(type* node); 354 virtual void Visit##type(type* node);
256 AST_NODE_LIST(DEF_VISIT) 355 AST_NODE_LIST(DEF_VISIT)
257 #undef DEF_VISIT 356 #undef DEF_VISIT
258 357
259 // Visit a statement and then spill the virtual frame if control flow can
260 // reach the end of the statement (ie, it does not exit via break,
261 // continue, return, or throw). This function is used temporarily while
262 // the code generator is being transformed.
263 inline void VisitAndSpill(Statement* statement);
264
265 // Visit a list of statements and then spill the virtual frame if control
266 // flow can reach the end of the list.
267 inline void VisitStatementsAndSpill(ZoneList<Statement*>* statements);
268
269 // Main code generation function 358 // Main code generation function
270 void Generate(CompilationInfo* info); 359 void Generate(CompilationInfo* info);
271 360
361 // Generate the return sequence code. Should be called no more than
362 // once per compiled function, immediately after binding the return
363 // target (which can not be done more than once). The return value should
364 // be in v0.
365 void GenerateReturnSequence();
366
367 // Returns the arguments allocation mode.
368 ArgumentsAllocationMode ArgumentsMode();
369
370 // Store the arguments object and allocate it if necessary.
371 void StoreArgumentsObject(bool initial);
372
272 // The following are used by class Reference. 373 // The following are used by class Reference.
273 void LoadReference(Reference* ref); 374 void LoadReference(Reference* ref);
274 void UnloadReference(Reference* ref); 375 void UnloadReference(Reference* ref);
275 376
276 MemOperand ContextOperand(Register context, int index) const {
277 return MemOperand(context, Context::SlotOffset(index));
278 }
279
280 MemOperand SlotOperand(Slot* slot, Register tmp); 377 MemOperand SlotOperand(Slot* slot, Register tmp);
281 378
282 // Expressions 379 MemOperand ContextSlotOperandCheckExtensions(Slot* slot,
283 MemOperand GlobalObject() const { 380 Register tmp,
284 return ContextOperand(cp, Context::GLOBAL_INDEX); 381 Register tmp2,
285 } 382 JumpTarget* slow);
286 383
287 void LoadCondition(Expression* x, 384 void LoadCondition(Expression* x,
288 JumpTarget* true_target, 385 JumpTarget* true_target,
289 JumpTarget* false_target, 386 JumpTarget* false_target,
290 bool force_cc); 387 bool force_cc);
291 void Load(Expression* x); 388 void Load(Expression* x);
292 void LoadGlobal(); 389 void LoadGlobal();
390 void LoadGlobalReceiver(Register scratch);
293 391
294 // Generate code to push the value of an expression on top of the frame 392
295 // and then spill the frame fully to memory. This function is used 393 // Special code for typeof expressions: Unfortunately, we must
296 // temporarily while the code generator is being transformed. 394 // be careful when loading the expression in 'typeof'
297 inline void LoadAndSpill(Expression* expression); 395 // expressions. We are not allowed to throw reference errors for
396 // non-existing properties of the global object, so we must make it
397 // look like an explicit property access, instead of an access
398 // through the context chain.
399 void LoadTypeofExpression(Expression* x);
400
401 // Store a keyed property. Key and receiver are on the stack and the value is
402 // in a0. Result is returned in r0.
403 void EmitKeyedStore(StaticType* key_type, WriteBarrierCharacter wb_info);
298 404
299 // Read a value from a slot and leave it on top of the expression stack. 405 // Read a value from a slot and leave it on top of the expression stack.
300 void LoadFromSlot(Slot* slot, TypeofState typeof_state); 406 void LoadFromSlot(Slot* slot, TypeofState typeof_state);
407 void LoadFromGlobalSlotCheckExtensions(Slot* slot,
408 TypeofState typeof_state,
409 JumpTarget* slow);
410 void LoadFromSlotCheckForArguments(Slot* slot, TypeofState state);
411
412 // Support for loading from local/global variables and arguments
413 // whose location is known unless they are shadowed by
414 // eval-introduced bindings. Generates no code for unsupported slot
415 // types and therefore expects to fall through to the slow jump target.
416 void EmitDynamicLoadFromSlotFastCase(Slot* slot,
417 TypeofState typeof_state,
418 JumpTarget* slow,
419 JumpTarget* done);
420
301 // Store the value on top of the stack to a slot. 421 // Store the value on top of the stack to a slot.
302 void StoreToSlot(Slot* slot, InitState init_state); 422 void StoreToSlot(Slot* slot, InitState init_state);
303 423
304 struct InlineRuntimeLUT { 424 // Support for compiling assignment expressions.
305 void (CodeGenerator::*method)(ZoneList<Expression*>*); 425 void EmitSlotAssignment(Assignment* node);
306 const char* name; 426 void EmitNamedPropertyAssignment(Assignment* node);
307 int nargs; 427 void EmitKeyedPropertyAssignment(Assignment* node);
308 };
309 428
310 static InlineRuntimeLUT* FindInlineRuntimeLUT(Handle<String> name); 429 // Load a named property, returning it in v0. The receiver is passed on the
430 // stack, and remains there.
431 void EmitNamedLoad(Handle<String> name, bool is_contextual);
432
433 // Store to a named property. If the store is contextual, value is passed on
434 // the frame and consumed. Otherwise, receiver and value are passed on the
435 // frame and consumed. The result is returned in v0.
436 void EmitNamedStore(Handle<String> name, bool is_contextual);
437
438 // Load a keyed property, leaving it in v0. The receiver and key are
439 // passed on the stack, and remain there.
440 void EmitKeyedLoad();
441
442 void ToBoolean(JumpTarget* true_target, JumpTarget* false_target);
443
444 // Generate code that computes a shortcutting logical operation.
445 void GenerateLogicalBooleanOperation(BinaryOperation* node);
446
447 void GenericBinaryOperation(Token::Value op,
448 OverwriteMode overwrite_mode,
449 GenerateInlineSmi inline_smi,
450 int known_rhs =
451 GenericBinaryOpStub::kUnknownIntValue);
452
453 void VirtualFrameBinaryOperation(Token::Value op,
454 OverwriteMode overwrite_mode,
455 int known_rhs =
456 GenericBinaryOpStub::kUnknownIntValue);
457
458 void SmiOperation(Token::Value op,
459 Handle<Object> value,
460 bool reversed,
461 OverwriteMode mode);
462
463 void Comparison(Condition cc,
464 Expression* left,
465 Expression* right,
466 bool strict = false);
467
468 void CallWithArguments(ZoneList<Expression*>* arguments,
469 CallFunctionFlags flags,
470 int position);
471
472 // An optimized implementation of expressions of the form
473 // x.apply(y, arguments). We call x the applicand and y the receiver.
474 // The optimization avoids allocating an arguments object if possible.
475 void CallApplyLazy(Expression* applicand,
476 Expression* receiver,
477 VariableProxy* arguments,
478 int position);
479
480 // Control flow
481 void Branch(bool if_true, JumpTarget* target);
482 void CheckStack();
483
311 bool CheckForInlineRuntimeCall(CallRuntime* node); 484 bool CheckForInlineRuntimeCall(CallRuntime* node);
312 485
313 static Handle<Code> ComputeLazyCompile(int argc); 486 static Handle<Code> ComputeLazyCompile(int argc);
314 void ProcessDeclarations(ZoneList<Declaration*>* declarations); 487 void ProcessDeclarations(ZoneList<Declaration*>* declarations);
315 488
316 Handle<Code> ComputeCallInitialize(int argc, InLoopFlag in_loop);
317
318 // Declare global variables and functions in the given array of 489 // Declare global variables and functions in the given array of
319 // name/value pairs. 490 // name/value pairs.
320 void DeclareGlobals(Handle<FixedArray> pairs); 491 void DeclareGlobals(Handle<FixedArray> pairs);
321 492
493 // Instantiate the function based on the shared function info.
494 void InstantiateFunction(Handle<SharedFunctionInfo> function_info,
495 bool pretenure);
496
322 // Support for type checks. 497 // Support for type checks.
323 void GenerateIsSmi(ZoneList<Expression*>* args); 498 void GenerateIsSmi(ZoneList<Expression*>* args);
324 void GenerateIsNonNegativeSmi(ZoneList<Expression*>* args); 499 void GenerateIsNonNegativeSmi(ZoneList<Expression*>* args);
325 void GenerateIsArray(ZoneList<Expression*>* args); 500 void GenerateIsArray(ZoneList<Expression*>* args);
326 void GenerateIsRegExp(ZoneList<Expression*>* args); 501 void GenerateIsRegExp(ZoneList<Expression*>* args);
327 502
328 // Support for construct call checks. 503 // Support for construct call checks.
329 void GenerateIsConstructCall(ZoneList<Expression*>* args); 504 void GenerateIsConstructCall(ZoneList<Expression*>* args);
330 505
331 // Support for arguments.length and arguments[?]. 506 // Support for arguments.length and arguments[?].
332 void GenerateArgumentsLength(ZoneList<Expression*>* args); 507 void GenerateArgumentsLength(ZoneList<Expression*>* args);
333 void GenerateArguments(ZoneList<Expression*>* args); 508 void GenerateArguments(ZoneList<Expression*>* args);
334 509
335 // Support for accessing the class and value fields of an object. 510 // Support for accessing the class and value fields of an object.
336 void GenerateClassOf(ZoneList<Expression*>* args); 511 void GenerateClassOf(ZoneList<Expression*>* args);
337 void GenerateValueOf(ZoneList<Expression*>* args); 512 void GenerateValueOf(ZoneList<Expression*>* args);
338 void GenerateSetValueOf(ZoneList<Expression*>* args); 513 void GenerateSetValueOf(ZoneList<Expression*>* args);
339 514
340 // Fast support for charCodeAt(n). 515 // Fast support for charCodeAt(n).
341 void GenerateFastCharCodeAt(ZoneList<Expression*>* args); 516 void GenerateStringCharCodeAt(ZoneList<Expression*>* args);
342 517
343 // Fast support for string.charAt(n) and string[n]. 518 // Fast support for string.charAt(n) and string[n].
344 void GenerateCharFromCode(ZoneList<Expression*>* args); 519 void GenerateStringCharFromCode(ZoneList<Expression*>* args);
520
521 // Fast support for string.charAt(n) and string[n].
522 void GenerateStringCharAt(ZoneList<Expression*>* args);
345 523
346 // Fast support for object equality testing. 524 // Fast support for object equality testing.
347 void GenerateObjectEquals(ZoneList<Expression*>* args); 525 void GenerateObjectEquals(ZoneList<Expression*>* args);
348 526
349 void GenerateLog(ZoneList<Expression*>* args); 527 void GenerateLog(ZoneList<Expression*>* args);
350 528
351 // Fast support for Math.random(). 529 // Fast support for Math.random().
352 void GenerateRandomHeapNumber(ZoneList<Expression*>* args); 530 void GenerateRandomHeapNumber(ZoneList<Expression*>* args);
353 531
354 void GenerateIsObject(ZoneList<Expression*>* args); 532 void GenerateIsObject(ZoneList<Expression*>* args);
355 void GenerateIsSpecObject(ZoneList<Expression*>* args); 533 void GenerateIsSpecObject(ZoneList<Expression*>* args);
356 void GenerateIsFunction(ZoneList<Expression*>* args); 534 void GenerateIsFunction(ZoneList<Expression*>* args);
357 void GenerateIsUndetectableObject(ZoneList<Expression*>* args); 535 void GenerateIsUndetectableObject(ZoneList<Expression*>* args);
358 void GenerateStringAdd(ZoneList<Expression*>* args); 536 void GenerateStringAdd(ZoneList<Expression*>* args);
359 void GenerateSubString(ZoneList<Expression*>* args); 537 void GenerateSubString(ZoneList<Expression*>* args);
360 void GenerateStringCompare(ZoneList<Expression*>* args); 538 void GenerateStringCompare(ZoneList<Expression*>* args);
539 void GenerateIsStringWrapperSafeForDefaultValueOf(
540 ZoneList<Expression*>* args);
541
542 // Support for direct calls from JavaScript to native RegExp code.
361 void GenerateRegExpExec(ZoneList<Expression*>* args); 543 void GenerateRegExpExec(ZoneList<Expression*>* args);
544
545 void GenerateRegExpConstructResult(ZoneList<Expression*>* args);
546
547 // Support for fast native caches.
548 void GenerateGetFromCache(ZoneList<Expression*>* args);
549
550 // Fast support for number to string.
362 void GenerateNumberToString(ZoneList<Expression*>* args); 551 void GenerateNumberToString(ZoneList<Expression*>* args);
363 552
553 // Fast swapping of elements.
554 void GenerateSwapElements(ZoneList<Expression*>* args);
555
556 // Fast call for custom callbacks.
557 void GenerateCallFunction(ZoneList<Expression*>* args);
558
364 // Fast call to math functions. 559 // Fast call to math functions.
365 void GenerateMathPow(ZoneList<Expression*>* args); 560 void GenerateMathPow(ZoneList<Expression*>* args);
366 void GenerateMathSin(ZoneList<Expression*>* args); 561 void GenerateMathSin(ZoneList<Expression*>* args);
367 void GenerateMathCos(ZoneList<Expression*>* args); 562 void GenerateMathCos(ZoneList<Expression*>* args);
368 void GenerateMathSqrt(ZoneList<Expression*>* args); 563 void GenerateMathSqrt(ZoneList<Expression*>* args);
564 void GenerateMathLog(ZoneList<Expression*>* args);
565
566 void GenerateIsRegExpEquivalent(ZoneList<Expression*>* args);
567
568 void GenerateHasCachedArrayIndex(ZoneList<Expression*>* args);
569 void GenerateGetCachedArrayIndex(ZoneList<Expression*>* args);
570 void GenerateFastAsciiArrayJoin(ZoneList<Expression*>* args);
369 571
370 // Simple condition analysis. 572 // Simple condition analysis.
371 enum ConditionAnalysis { 573 enum ConditionAnalysis {
372 ALWAYS_TRUE, 574 ALWAYS_TRUE,
373 ALWAYS_FALSE, 575 ALWAYS_FALSE,
374 DONT_KNOW 576 DONT_KNOW
375 }; 577 };
376 ConditionAnalysis AnalyzeCondition(Expression* cond); 578 ConditionAnalysis AnalyzeCondition(Expression* cond);
377 579
378 // Methods used to indicate which source code is generated for. Source 580 // Methods used to indicate which source code is generated for. Source
379 // positions are collected by the assembler and emitted with the relocation 581 // positions are collected by the assembler and emitted with the relocation
380 // information. 582 // information.
381 void CodeForFunctionPosition(FunctionLiteral* fun); 583 void CodeForFunctionPosition(FunctionLiteral* fun);
382 void CodeForReturnPosition(FunctionLiteral* fun); 584 void CodeForReturnPosition(FunctionLiteral* fun);
383 void CodeForStatementPosition(Statement* node); 585 void CodeForStatementPosition(Statement* node);
384 void CodeForDoWhileConditionPosition(DoWhileStatement* stmt); 586 void CodeForDoWhileConditionPosition(DoWhileStatement* stmt);
385 void CodeForSourcePosition(int pos); 587 void CodeForSourcePosition(int pos);
386 588
387 #ifdef DEBUG 589 #ifdef DEBUG
388 // True if the registers are valid for entry to a block. 590 // True if the registers are valid for entry to a block.
389 bool HasValidEntryRegisters(); 591 bool HasValidEntryRegisters();
390 #endif 592 #endif
391 593
392 bool is_eval_; // Tells whether code is generated for eval.
393
394 Handle<Script> script_;
395 List<DeferredCode*> deferred_; 594 List<DeferredCode*> deferred_;
396 595
397 // Assembler 596 // Assembler
398 MacroAssembler* masm_; // to generate code 597 MacroAssembler* masm_; // to generate code
399 598
400 CompilationInfo* info_; 599 CompilationInfo* info_;
401 600
402 // Code generation state 601 // Code generation state
403 VirtualFrame* frame_; 602 VirtualFrame* frame_;
404 RegisterAllocator* allocator_; 603 RegisterAllocator* allocator_;
405 Condition cc_reg_; 604 Condition cc_reg_;
406 CodeGenState* state_; 605 CodeGenState* state_;
606 int loop_nesting_;
407 607
608 Vector<TypeInfo>* type_info_;
408 // Jump targets 609 // Jump targets
409 BreakTarget function_return_; 610 BreakTarget function_return_;
410 611
411 // True if the function return is shadowed (ie, jumping to the target 612 // True if the function return is shadowed (ie, jumping to the target
412 // function_return_ does not jump to the true function return, but rather 613 // function_return_ does not jump to the true function return, but rather
413 // to some unlinking code). 614 // to some unlinking code).
414 bool function_return_is_shadowed_; 615 bool function_return_is_shadowed_;
415 616
416 static InlineRuntimeLUT kInlineRuntimeLUT[];
417
418 friend class VirtualFrame; 617 friend class VirtualFrame;
618 friend class Isolate;
419 friend class JumpTarget; 619 friend class JumpTarget;
420 friend class Reference; 620 friend class Reference;
421 friend class FastCodeGenerator; 621 friend class FastCodeGenerator;
422 friend class FullCodeGenerator; 622 friend class FullCodeGenerator;
423 friend class FullCodeGenSyntaxChecker; 623 friend class FullCodeGenSyntaxChecker;
624 friend class InlineRuntimeFunctionsTable;
625 friend class LCodeGen;
424 626
425 DISALLOW_COPY_AND_ASSIGN(CodeGenerator); 627 DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
426 }; 628 };
427 629
428 630
429 } } // namespace v8::internal 631 } } // namespace v8::internal
430 632
431 #endif // V8_MIPS_CODEGEN_MIPS_H_ 633 #endif // V8_MIPS_CODEGEN_MIPS_H_
OLDNEW
« no previous file with comments | « src/mips/code-stubs-mips.cc ('k') | src/mips/codegen-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698