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

Unified Diff: src/codegen-ia32.cc

Issue 21447: Experimental: introduce a simple mechanism to allow jump targets with... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/toiger/
Patch Set: '' Created 11 years, 10 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 side-by-side diff with in-line comments
Download patch
« src/codegen.h ('K') | « src/codegen-arm.cc ('k') | src/jump-target.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/codegen-ia32.cc
===================================================================
--- src/codegen-ia32.cc (revision 1296)
+++ src/codegen-ia32.cc (working copy)
@@ -738,7 +738,7 @@
generator()->frame()->Push(&left);
generator()->frame()->Push(&right);
Result answer = generator()->frame()->CallStub(&stub_, 2);
- exit()->Jump(&answer);
+ exit_.Jump(&answer);
}
@@ -786,7 +786,7 @@
// Generate the inline part of the code.
// The operands are on the frame.
Result answer = deferred->GenerateInlineCode();
- deferred->exit()->Bind(&answer);
+ deferred->BindExit(&answer);
frame_->Push(&answer);
} else {
// Call the stub and push the result to the stack.
@@ -826,7 +826,7 @@
generator()->frame()->Push(value_);
GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED);
Result answer = generator()->frame()->CallStub(&igostub, 2);
- exit()->Jump(&answer);
+ exit_.Jump(&answer);
}
@@ -859,7 +859,7 @@
generator()->frame()->Push(&right);
GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED);
Result answer = generator()->frame()->CallStub(&igostub, 2);
- exit()->Jump(&answer);
+ exit_.Jump(&answer);
}
@@ -893,7 +893,7 @@
generator()->frame()->Push(value_);
GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED);
Result answer = generator()->frame()->CallStub(&igostub, 2);
- exit()->Jump(&answer);
+ exit_.Jump(&answer);
}
@@ -927,7 +927,7 @@
generator()->frame()->Push(&right);
GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED);
Result answer = generator()->frame()->CallStub(&igostub, 2);
- exit()->Jump(&answer);
+ exit_.Jump(&answer);
}
@@ -961,7 +961,7 @@
generator()->frame()->Push(value_);
GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_, SMI_CODE_INLINED);
Result answer = generator()->frame()->CallStub(&igostub, 2);
- exit()->Jump(&answer);
+ exit_.Jump(&answer);
}
@@ -992,7 +992,7 @@
generator()->frame()->Push(&right);
GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_, SMI_CODE_INLINED);
Result answer = generator()->frame()->CallStub(&igostub, 2);
- exit()->Jump(&answer);
+ exit_.Jump(&answer);
}
@@ -1032,7 +1032,7 @@
deferred->enter()->Branch(overflow, &operand, not_taken);
__ test(Operand(operand.reg()), Immediate(kSmiTagMask));
deferred->enter()->Branch(not_zero, &operand, not_taken);
- deferred->exit()->Bind(&operand);
+ deferred->BindExit(&operand);
frame_->Push(&operand);
break;
}
@@ -1067,7 +1067,7 @@
__ test(answer.reg(), Immediate(kSmiTagMask));
deferred->enter()->Branch(not_zero, &operand, not_taken);
operand.Unuse();
- deferred->exit()->Bind(&answer);
+ deferred->BindExit(&answer);
frame_->Push(&answer);
break;
}
@@ -1092,7 +1092,7 @@
frame_->Spill(result.reg());
__ sar(result.reg(), shift_value);
__ and_(result.reg(), ~kSmiTagMask);
- deferred->exit()->Bind(&result);
+ deferred->BindExit(&result);
frame_->Push(&result);
}
break;
@@ -1129,7 +1129,7 @@
ASSERT(kSmiTagSize == times_2); // Adjust the code if not true.
__ lea(answer.reg(),
Operand(answer.reg(), answer.reg(), times_1, kSmiTag));
- deferred->exit()->Bind(&answer);
+ deferred->BindExit(&answer);
frame_->Push(&answer);
}
break;
@@ -1167,7 +1167,7 @@
__ add(answer.reg(), Operand(answer.reg()));
deferred->enter()->Branch(overflow, &operand, not_taken);
operand.Unuse();
- deferred->exit()->Bind(&answer);
+ deferred->BindExit(&answer);
frame_->Push(&answer);
}
break;
@@ -1197,7 +1197,7 @@
ASSERT(op == Token::BIT_OR);
__ or_(Operand(operand.reg()), Immediate(value));
}
- deferred->exit()->Bind(&operand);
+ deferred->BindExit(&operand);
frame_->Push(&operand);
break;
}
@@ -1472,11 +1472,11 @@
enter()->Bind();
// The stack check can trigger the debugger. Before calling it, all
// values including constants must be spilled to the frame.
- generator()->frame()->SpillAll();
+ // generator()->frame()->SpillAll();
Kasper Lund 2009/02/18 12:11:17 Remove?
Kevin Millikin (Chromium) 2009/02/18 12:26:22 Yes.
StackCheckStub stub;
Result ignored = generator()->frame()->CallStub(&stub, 0);
ignored.Unuse();
- exit()->Jump();
+ exit_.Jump();
}
@@ -1487,7 +1487,7 @@
ExternalReference::address_of_stack_guard_limit();
__ cmp(esp, Operand::StaticVariable(stack_guard_limit));
deferred->enter()->Branch(below, not_taken);
- deferred->exit()->Bind();
+ deferred->BindExit();
}
}
@@ -3102,7 +3102,7 @@
frame->Push(node_->flags());
Result boilerplate =
frame->CallRuntime(Runtime::kMaterializeRegExpLiteral, 4);
- exit()->Jump(&boilerplate);
+ exit_.Jump(&boilerplate);
}
@@ -3136,7 +3136,7 @@
literals.Unuse();
// The deferred code returns the boilerplate object.
- deferred->exit()->Bind(&boilerplate);
+ deferred->BindExit(&boilerplate);
// Push the boilerplate object.
frame_->Push(&boilerplate);
@@ -3177,7 +3177,7 @@
frame->Push(node_->constant_properties());
Result boilerplate =
frame->CallRuntime(Runtime::kCreateObjectLiteralBoilerplate, 3);
- exit()->Jump(&boilerplate);
+ exit_.Jump(&boilerplate);
}
@@ -3211,7 +3211,7 @@
literals.Unuse();
// The deferred code returns the boilerplate object.
- deferred->exit()->Bind(&boilerplate);
+ deferred->BindExit(&boilerplate);
// Push the boilerplate object.
frame_->Push(&boilerplate);
@@ -4285,7 +4285,7 @@
CounterOpStub stub(result_offset_, is_postfix_, is_increment_);
value = generator()->frame()->CallStub(&stub, &value, 0);
- exit()->Jump(&value);
+ exit_.Jump(&value);
}
@@ -4371,7 +4371,7 @@
}
// Store the new value in the target if not const.
- deferred->exit()->Bind(&value);
+ deferred->BindExit(&value);
frame_->Push(&value);
if (!is_const) {
target.SetValue(NOT_CONST_INIT);
@@ -4822,7 +4822,14 @@
int delta_to_patch_site = __ SizeOfCodeGeneratedSince(patch_site());
__ test(value.reg(), Immediate(-delta_to_patch_site));
__ IncrementCounter(&Counters::keyed_load_inline_miss, 1);
- exit()->Jump(&value);
+
+ // The receiver and key were spilled by the call, so their state as
+ // constants or copies has been changed. Thus, they need to be
+ // "mergable" in the block at the exit label and are therefore
+ // passed as return results here.
+ key = cgen->frame()->Pop();
+ receiver = cgen->frame()->Pop();
+ exit_.Jump(&receiver, &key, &value);
}
@@ -4965,9 +4972,9 @@
// Restore the receiver and key to the frame and push the
// result on top of it.
+ deferred->BindExit(&receiver, &key, &value);
cgen_->frame()->Push(&receiver);
cgen_->frame()->Push(&key);
- deferred->exit()->Bind(&value);
cgen_->frame()->Push(&value);
} else {
« src/codegen.h ('K') | « src/codegen-arm.cc ('k') | src/jump-target.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698