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

Unified Diff: src/fast-codegen.h

Issue 541047: Introduce 'top-of-stack caching' to the toplevel code generator by... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 11 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
« no previous file with comments | « src/arm/fast-codegen-arm.cc ('k') | src/fast-codegen.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/fast-codegen.h
===================================================================
--- src/fast-codegen.h (revision 3626)
+++ src/fast-codegen.h (working copy)
@@ -47,6 +47,7 @@
is_eval_(is_eval),
nesting_stack_(NULL),
loop_depth_(0),
+ location_(kStack),
true_label_(NULL),
false_label_(NULL) {
}
@@ -210,25 +211,37 @@
DISALLOW_COPY_AND_ASSIGN(ForIn);
};
+ enum Location {
+ kAccumulator,
+ kStack
+ };
int SlotOffset(Slot* slot);
- // Emit code to complete the evaluation of an expression based on its
- // expression context and given its value is in a register, non-lookup
- // slot, or a literal.
+ // Emit code to convert a pure value (in a register, slot, as a literal,
+ // or on top of the stack) into the result expected according to an
+ // expression context.
void Apply(Expression::Context context, Register reg);
- void Apply(Expression::Context context, Slot* slot, Register scratch);
+ void Apply(Expression::Context context, Slot* slot);
void Apply(Expression::Context context, Literal* lit);
-
- // Emit code to complete the evaluation of an expression based on its
- // expression context and given its value is on top of the stack.
void ApplyTOS(Expression::Context context);
- // Emit code to discard count elements from the top of stack, then
- // complete the evaluation of an expression based on its expression
- // context and given its value is in a register.
+ // Emit code to discard count elements from the top of stack, then convert
+ // a pure value into the result expected according to an expression
+ // context.
void DropAndApply(int count, Expression::Context context, Register reg);
+ // Emit code to convert pure control flow to a pair of labels into the
+ // result expected according to an expression context.
+ void Apply(Expression::Context context,
+ Label* materialize_true,
+ Label* materialize_false);
+
+ // Helper function to convert a pure value into a test context. The value
+ // is expected on the stack or the accumulator, depending on the platform.
+ // See the platform-specific implementation for details.
+ void DoTest(Expression::Context context);
+
void Move(Slot* dst, Register source, Register scratch1, Register scratch2);
void Move(Register dst, Slot* source);
@@ -237,9 +250,13 @@
// register.
MemOperand EmitSlotSearch(Slot* slot, Register scratch);
- // Test the JavaScript value in source as if in a test context, compile
- // control flow to a pair of labels.
- void TestAndBranch(Register source, Label* true_label, Label* false_label);
+ void VisitForValue(Expression* expr, Location where) {
+ ASSERT(expr->context() == Expression::kValue);
+ Location saved_location = location_;
+ location_ = where;
+ Visit(expr);
+ location_ = saved_location;
+ }
void VisitForControl(Expression* expr, Label* if_true, Label* if_false) {
ASSERT(expr->context() == Expression::kTest ||
@@ -277,20 +294,21 @@
// The receiver and the key is left on the stack by the IC.
void EmitKeyedPropertyLoad(Property* expr);
- // Apply the compound assignment operator. Expects both operands on top
- // of the stack.
- void EmitCompoundAssignmentOp(Token::Value op, Expression::Context context);
+ // Apply the compound assignment operator. Expects the left operand on top
+ // of the stack and the right one in the accumulator.
+ void EmitBinaryOp(Token::Value op, Expression::Context context);
// Complete a variable assignment. The right-hand-side value is expected
- // on top of the stack.
+ // in the accumulator.
void EmitVariableAssignment(Variable* var, Expression::Context context);
- // Complete a named property assignment. The receiver and right-hand-side
- // value are expected on top of the stack.
+ // Complete a named property assignment. The receiver is expected on top
+ // of the stack and the right-hand-side value in the accumulator.
void EmitNamedPropertyAssignment(Assignment* expr);
- // Complete a keyed property assignment. The reciever, key, and
- // right-hand-side value are expected on top of the stack.
+ // Complete a keyed property assignment. The receiver and key are
+ // expected on top of the stack and the right-hand-side value in the
+ // accumulator.
void EmitKeyedPropertyAssignment(Assignment* expr);
void SetFunctionPosition(FunctionLiteral* fun);
@@ -338,6 +356,7 @@
NestedStatement* nesting_stack_;
int loop_depth_;
+ Location location_;
Label* true_label_;
Label* false_label_;
« no previous file with comments | « src/arm/fast-codegen-arm.cc ('k') | src/fast-codegen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698