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

Side by Side Diff: src/ia32/codegen-ia32.cc

Issue 502028: Streamline the calling convention of the call ICs by passing the... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years 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/ia32/builtins-ia32.cc ('k') | src/ia32/fast-codegen-ia32.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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 4525 matching lines...) Expand 10 before | Expand all | Expand 10 after
4536 // Restore the context and overwrite the function on the stack with 4536 // Restore the context and overwrite the function on the stack with
4537 // the result. 4537 // the result.
4538 frame_->RestoreContextRegister(); 4538 frame_->RestoreContextRegister();
4539 frame_->SetElementAt(0, &result); 4539 frame_->SetElementAt(0, &result);
4540 4540
4541 } else if (var != NULL && !var->is_this() && var->is_global()) { 4541 } else if (var != NULL && !var->is_this() && var->is_global()) {
4542 // ---------------------------------- 4542 // ----------------------------------
4543 // JavaScript example: 'foo(1, 2, 3)' // foo is global 4543 // JavaScript example: 'foo(1, 2, 3)' // foo is global
4544 // ---------------------------------- 4544 // ----------------------------------
4545 4545
4546 // Push the name of the function and the receiver onto the stack.
4547 frame_->Push(var->name());
4548
4549 // Pass the global object as the receiver and let the IC stub 4546 // Pass the global object as the receiver and let the IC stub
4550 // patch the stack to use the global proxy as 'this' in the 4547 // patch the stack to use the global proxy as 'this' in the
4551 // invoked function. 4548 // invoked function.
4552 LoadGlobal(); 4549 LoadGlobal();
4553 4550
4554 // Load the arguments. 4551 // Load the arguments.
4555 int arg_count = args->length(); 4552 int arg_count = args->length();
4556 for (int i = 0; i < arg_count; i++) { 4553 for (int i = 0; i < arg_count; i++) {
4557 Load(args->at(i)); 4554 Load(args->at(i));
4558 } 4555 }
4559 4556
4557 // Push the name of the function onto the frame.
4558 frame_->Push(var->name());
4559
4560 // Call the IC initialization code. 4560 // Call the IC initialization code.
4561 CodeForSourcePosition(node->position()); 4561 CodeForSourcePosition(node->position());
4562 Result result = frame_->CallCallIC(RelocInfo::CODE_TARGET_CONTEXT, 4562 Result result = frame_->CallCallIC(RelocInfo::CODE_TARGET_CONTEXT,
4563 arg_count, 4563 arg_count,
4564 loop_nesting()); 4564 loop_nesting());
4565 frame_->RestoreContextRegister(); 4565 frame_->RestoreContextRegister();
4566 // Replace the function on the stack with the result. 4566 frame_->Push(&result);
4567 frame_->SetElementAt(0, &result);
4568 4567
4569 } else if (var != NULL && var->slot() != NULL && 4568 } else if (var != NULL && var->slot() != NULL &&
4570 var->slot()->type() == Slot::LOOKUP) { 4569 var->slot()->type() == Slot::LOOKUP) {
4571 // ---------------------------------- 4570 // ----------------------------------
4572 // JavaScript example: 'with (obj) foo(1, 2, 3)' // foo is in obj 4571 // JavaScript example: 'with (obj) foo(1, 2, 3)' // foo is in obj
4573 // ---------------------------------- 4572 // ----------------------------------
4574 4573
4575 // Load the function from the context. Sync the frame so we can 4574 // Load the function from the context. Sync the frame so we can
4576 // push the arguments directly into place. 4575 // push the arguments directly into place.
4577 frame_->SyncRange(0, frame_->element_count() - 1); 4576 frame_->SyncRange(0, frame_->element_count() - 1);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4610 args->at(1)->AsVariableProxy() != NULL && 4609 args->at(1)->AsVariableProxy() != NULL &&
4611 args->at(1)->AsVariableProxy()->IsArguments()) { 4610 args->at(1)->AsVariableProxy()->IsArguments()) {
4612 // Use the optimized Function.prototype.apply that avoids 4611 // Use the optimized Function.prototype.apply that avoids
4613 // allocating lazily allocated arguments objects. 4612 // allocating lazily allocated arguments objects.
4614 CallApplyLazy(property, 4613 CallApplyLazy(property,
4615 args->at(0), 4614 args->at(0),
4616 args->at(1)->AsVariableProxy(), 4615 args->at(1)->AsVariableProxy(),
4617 node->position()); 4616 node->position());
4618 4617
4619 } else { 4618 } else {
4620 // Push the name of the function and the receiver onto the stack. 4619 // Push the receiver onto the frame.
4621 frame_->Push(name);
4622 Load(property->obj()); 4620 Load(property->obj());
4623 4621
4624 // Load the arguments. 4622 // Load the arguments.
4625 int arg_count = args->length(); 4623 int arg_count = args->length();
4626 for (int i = 0; i < arg_count; i++) { 4624 for (int i = 0; i < arg_count; i++) {
4627 Load(args->at(i)); 4625 Load(args->at(i));
4628 } 4626 }
4629 4627
4628 // Push the name of the function onto the frame.
4629 frame_->Push(name);
4630
4630 // Call the IC initialization code. 4631 // Call the IC initialization code.
4631 CodeForSourcePosition(node->position()); 4632 CodeForSourcePosition(node->position());
4632 Result result = 4633 Result result =
4633 frame_->CallCallIC(RelocInfo::CODE_TARGET, arg_count, 4634 frame_->CallCallIC(RelocInfo::CODE_TARGET, arg_count,
4634 loop_nesting()); 4635 loop_nesting());
4635 frame_->RestoreContextRegister(); 4636 frame_->RestoreContextRegister();
4636 // Replace the function on the stack with the result. 4637 frame_->Push(&result);
4637 frame_->SetElementAt(0, &result);
4638 } 4638 }
4639 4639
4640 } else { 4640 } else {
4641 // ------------------------------------------- 4641 // -------------------------------------------
4642 // JavaScript example: 'array[index](1, 2, 3)' 4642 // JavaScript example: 'array[index](1, 2, 3)'
4643 // ------------------------------------------- 4643 // -------------------------------------------
4644 4644
4645 // Load the function to call from the property through a reference. 4645 // Load the function to call from the property through a reference.
4646 Reference ref(this, property); 4646 Reference ref(this, property);
4647 ref.GetValue(); 4647 ref.GetValue();
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
5285 void CodeGenerator::VisitCallRuntime(CallRuntime* node) { 5285 void CodeGenerator::VisitCallRuntime(CallRuntime* node) {
5286 if (CheckForInlineRuntimeCall(node)) { 5286 if (CheckForInlineRuntimeCall(node)) {
5287 return; 5287 return;
5288 } 5288 }
5289 5289
5290 ZoneList<Expression*>* args = node->arguments(); 5290 ZoneList<Expression*>* args = node->arguments();
5291 Comment cmnt(masm_, "[ CallRuntime"); 5291 Comment cmnt(masm_, "[ CallRuntime");
5292 Runtime::Function* function = node->function(); 5292 Runtime::Function* function = node->function();
5293 5293
5294 if (function == NULL) { 5294 if (function == NULL) {
5295 // Prepare stack for calling JS runtime function.
5296 frame_->Push(node->name());
5297 // Push the builtins object found in the current global object. 5295 // Push the builtins object found in the current global object.
5298 Result temp = allocator()->Allocate(); 5296 Result temp = allocator()->Allocate();
5299 ASSERT(temp.is_valid()); 5297 ASSERT(temp.is_valid());
5300 __ mov(temp.reg(), GlobalObject()); 5298 __ mov(temp.reg(), GlobalObject());
5301 __ mov(temp.reg(), FieldOperand(temp.reg(), GlobalObject::kBuiltinsOffset)); 5299 __ mov(temp.reg(), FieldOperand(temp.reg(), GlobalObject::kBuiltinsOffset));
5302 frame_->Push(&temp); 5300 frame_->Push(&temp);
5303 } 5301 }
5304 5302
5305 // Push the arguments ("left-to-right"). 5303 // Push the arguments ("left-to-right").
5306 int arg_count = args->length(); 5304 int arg_count = args->length();
5307 for (int i = 0; i < arg_count; i++) { 5305 for (int i = 0; i < arg_count; i++) {
5308 Load(args->at(i)); 5306 Load(args->at(i));
5309 } 5307 }
5310 5308
5311 if (function == NULL) { 5309 if (function == NULL) {
5312 // Call the JS runtime function. 5310 // Call the JS runtime function.
5311 frame_->Push(node->name());
5313 Result answer = frame_->CallCallIC(RelocInfo::CODE_TARGET, 5312 Result answer = frame_->CallCallIC(RelocInfo::CODE_TARGET,
5314 arg_count, 5313 arg_count,
5315 loop_nesting_); 5314 loop_nesting_);
5316 frame_->RestoreContextRegister(); 5315 frame_->RestoreContextRegister();
5317 frame_->SetElementAt(0, &answer); 5316 frame_->Push(&answer);
5318 } else { 5317 } else {
5319 // Call the C runtime function. 5318 // Call the C runtime function.
5320 Result answer = frame_->CallRuntime(function, arg_count); 5319 Result answer = frame_->CallRuntime(function, arg_count);
5321 frame_->Push(&answer); 5320 frame_->Push(&answer);
5322 } 5321 }
5323 } 5322 }
5324 5323
5325 5324
5326 void CodeGenerator::VisitUnaryOperation(UnaryOperation* node) { 5325 void CodeGenerator::VisitUnaryOperation(UnaryOperation* node) {
5327 Comment cmnt(masm_, "[ UnaryOperation"); 5326 Comment cmnt(masm_, "[ UnaryOperation");
(...skipping 3130 matching lines...) Expand 10 before | Expand all | Expand 10 after
8458 __ add(Operand(dest), Immediate(2)); 8457 __ add(Operand(dest), Immediate(2));
8459 } 8458 }
8460 __ sub(Operand(count), Immediate(1)); 8459 __ sub(Operand(count), Immediate(1));
8461 __ j(not_zero, &loop); 8460 __ j(not_zero, &loop);
8462 } 8461 }
8463 8462
8464 8463
8465 #undef __ 8464 #undef __
8466 8465
8467 } } // namespace v8::internal 8466 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ia32/builtins-ia32.cc ('k') | src/ia32/fast-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698