Simplify deferred code by removing some unneeded or redundant stuff.

Review URL: http://codereview.chromium.org/113895

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2065 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 2e37ebe1
...@@ -289,9 +289,7 @@ void CodeGenerator::GenCode(FunctionLiteral* fun) { ...@@ -289,9 +289,7 @@ void CodeGenerator::GenCode(FunctionLiteral* fun) {
DeleteFrame(); DeleteFrame();
// Process any deferred code using the register allocator. // Process any deferred code using the register allocator.
if (HasStackOverflow()) { if (!HasStackOverflow()) {
ClearDeferred();
} else {
ProcessDeferred(); ProcessDeferred();
} }
...@@ -757,13 +755,11 @@ void CodeGenerator::GenericBinaryOperation(Token::Value op, ...@@ -757,13 +755,11 @@ void CodeGenerator::GenericBinaryOperation(Token::Value op,
class DeferredInlineSmiOperation: public DeferredCode { class DeferredInlineSmiOperation: public DeferredCode {
public: public:
DeferredInlineSmiOperation(CodeGenerator* generator, DeferredInlineSmiOperation(Token::Value op,
Token::Value op,
int value, int value,
bool reversed, bool reversed,
OverwriteMode overwrite_mode) OverwriteMode overwrite_mode)
: DeferredCode(generator), : op_(op),
op_(op),
value_(value), value_(value),
reversed_(reversed), reversed_(reversed),
overwrite_mode_(overwrite_mode) { overwrite_mode_(overwrite_mode) {
...@@ -780,7 +776,12 @@ class DeferredInlineSmiOperation: public DeferredCode { ...@@ -780,7 +776,12 @@ class DeferredInlineSmiOperation: public DeferredCode {
}; };
#undef __
#define __ ACCESS_MASM(masm)
void DeferredInlineSmiOperation::Generate() { void DeferredInlineSmiOperation::Generate() {
MacroAssembler* masm = cgen()->masm();
enter()->Bind(); enter()->Bind();
VirtualFrame::SpilledScope spilled_scope; VirtualFrame::SpilledScope spilled_scope;
...@@ -841,15 +842,19 @@ void DeferredInlineSmiOperation::Generate() { ...@@ -841,15 +842,19 @@ void DeferredInlineSmiOperation::Generate() {
} }
GenericBinaryOpStub igostub(op_, overwrite_mode_); GenericBinaryOpStub igostub(op_, overwrite_mode_);
Result arg0 = generator()->allocator()->Allocate(r1); Result arg0 = cgen()->allocator()->Allocate(r1);
ASSERT(arg0.is_valid()); ASSERT(arg0.is_valid());
Result arg1 = generator()->allocator()->Allocate(r0); Result arg1 = cgen()->allocator()->Allocate(r0);
ASSERT(arg1.is_valid()); ASSERT(arg1.is_valid());
generator()->frame()->CallStub(&igostub, &arg0, &arg1); cgen()->frame()->CallStub(&igostub, &arg0, &arg1);
exit_.Jump(); exit_.Jump();
} }
#undef __
#define __ ACCESS_MASM(masm_)
void CodeGenerator::SmiOperation(Token::Value op, void CodeGenerator::SmiOperation(Token::Value op,
Handle<Object> value, Handle<Object> value,
bool reversed, bool reversed,
...@@ -872,7 +877,7 @@ void CodeGenerator::SmiOperation(Token::Value op, ...@@ -872,7 +877,7 @@ void CodeGenerator::SmiOperation(Token::Value op,
switch (op) { switch (op) {
case Token::ADD: { case Token::ADD: {
DeferredCode* deferred = DeferredCode* deferred =
new DeferredInlineSmiOperation(this, op, int_value, reversed, mode); new DeferredInlineSmiOperation(op, int_value, reversed, mode);
__ add(r0, r0, Operand(value), SetCC); __ add(r0, r0, Operand(value), SetCC);
deferred->enter()->Branch(vs); deferred->enter()->Branch(vs);
...@@ -884,7 +889,7 @@ void CodeGenerator::SmiOperation(Token::Value op, ...@@ -884,7 +889,7 @@ void CodeGenerator::SmiOperation(Token::Value op,
case Token::SUB: { case Token::SUB: {
DeferredCode* deferred = DeferredCode* deferred =
new DeferredInlineSmiOperation(this, op, int_value, reversed, mode); new DeferredInlineSmiOperation(op, int_value, reversed, mode);
if (!reversed) { if (!reversed) {
__ sub(r0, r0, Operand(value), SetCC); __ sub(r0, r0, Operand(value), SetCC);
...@@ -902,7 +907,7 @@ void CodeGenerator::SmiOperation(Token::Value op, ...@@ -902,7 +907,7 @@ void CodeGenerator::SmiOperation(Token::Value op,
case Token::BIT_XOR: case Token::BIT_XOR:
case Token::BIT_AND: { case Token::BIT_AND: {
DeferredCode* deferred = DeferredCode* deferred =
new DeferredInlineSmiOperation(this, op, int_value, reversed, mode); new DeferredInlineSmiOperation(op, int_value, reversed, mode);
__ tst(r0, Operand(kSmiTagMask)); __ tst(r0, Operand(kSmiTagMask));
deferred->enter()->Branch(ne); deferred->enter()->Branch(ne);
switch (op) { switch (op) {
...@@ -927,7 +932,7 @@ void CodeGenerator::SmiOperation(Token::Value op, ...@@ -927,7 +932,7 @@ void CodeGenerator::SmiOperation(Token::Value op,
} else { } else {
int shift_value = int_value & 0x1f; // least significant 5 bits int shift_value = int_value & 0x1f; // least significant 5 bits
DeferredCode* deferred = DeferredCode* deferred =
new DeferredInlineSmiOperation(this, op, shift_value, false, mode); new DeferredInlineSmiOperation(op, shift_value, false, mode);
__ tst(r0, Operand(kSmiTagMask)); __ tst(r0, Operand(kSmiTagMask));
deferred->enter()->Branch(ne); deferred->enter()->Branch(ne);
__ mov(r2, Operand(r0, ASR, kSmiTagSize)); // remove tags __ mov(r2, Operand(r0, ASR, kSmiTagSize)); // remove tags
...@@ -2654,8 +2659,7 @@ void CodeGenerator::VisitRegExpLiteral(RegExpLiteral* node) { ...@@ -2654,8 +2659,7 @@ void CodeGenerator::VisitRegExpLiteral(RegExpLiteral* node) {
// therefore context dependent. // therefore context dependent.
class DeferredObjectLiteral: public DeferredCode { class DeferredObjectLiteral: public DeferredCode {
public: public:
DeferredObjectLiteral(CodeGenerator* generator, ObjectLiteral* node) explicit DeferredObjectLiteral(ObjectLiteral* node) : node_(node) {
: DeferredCode(generator), node_(node) {
set_comment("[ DeferredObjectLiteral"); set_comment("[ DeferredObjectLiteral");
} }
...@@ -2666,7 +2670,12 @@ class DeferredObjectLiteral: public DeferredCode { ...@@ -2666,7 +2670,12 @@ class DeferredObjectLiteral: public DeferredCode {
}; };
#undef __
#define __ ACCESS_MASM(masm)
void DeferredObjectLiteral::Generate() { void DeferredObjectLiteral::Generate() {
MacroAssembler* masm = cgen()->masm();
// Argument is passed in r1. // Argument is passed in r1.
enter()->Bind(); enter()->Bind();
VirtualFrame::SpilledScope spilled_scope; VirtualFrame::SpilledScope spilled_scope;
...@@ -2674,7 +2683,7 @@ void DeferredObjectLiteral::Generate() { ...@@ -2674,7 +2683,7 @@ void DeferredObjectLiteral::Generate() {
// If the entry is undefined we call the runtime system to compute // If the entry is undefined we call the runtime system to compute
// the literal. // the literal.
VirtualFrame* frame = generator()->frame(); VirtualFrame* frame = cgen()->frame();
// Literal array (0). // Literal array (0).
frame->EmitPush(r1); frame->EmitPush(r1);
// Literal index (1). // Literal index (1).
...@@ -2691,6 +2700,10 @@ void DeferredObjectLiteral::Generate() { ...@@ -2691,6 +2700,10 @@ void DeferredObjectLiteral::Generate() {
} }
#undef __
#define __ ACCESS_MASM(masm_)
void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) {
#ifdef DEBUG #ifdef DEBUG
int original_height = frame_->height(); int original_height = frame_->height();
...@@ -2698,7 +2711,7 @@ void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { ...@@ -2698,7 +2711,7 @@ void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) {
VirtualFrame::SpilledScope spilled_scope; VirtualFrame::SpilledScope spilled_scope;
Comment cmnt(masm_, "[ ObjectLiteral"); Comment cmnt(masm_, "[ ObjectLiteral");
DeferredObjectLiteral* deferred = new DeferredObjectLiteral(this, node); DeferredObjectLiteral* deferred = new DeferredObjectLiteral(node);
// Retrieve the literal array and check the allocated entry. // Retrieve the literal array and check the allocated entry.
...@@ -2783,8 +2796,7 @@ void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { ...@@ -2783,8 +2796,7 @@ void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) {
// therefore context dependent. // therefore context dependent.
class DeferredArrayLiteral: public DeferredCode { class DeferredArrayLiteral: public DeferredCode {
public: public:
DeferredArrayLiteral(CodeGenerator* generator, ArrayLiteral* node) explicit DeferredArrayLiteral(ArrayLiteral* node) : node_(node) {
: DeferredCode(generator), node_(node) {
set_comment("[ DeferredArrayLiteral"); set_comment("[ DeferredArrayLiteral");
} }
...@@ -2795,7 +2807,12 @@ class DeferredArrayLiteral: public DeferredCode { ...@@ -2795,7 +2807,12 @@ class DeferredArrayLiteral: public DeferredCode {
}; };
#undef __
#define __ ACCESS_MASM(masm)
void DeferredArrayLiteral::Generate() { void DeferredArrayLiteral::Generate() {
MacroAssembler* masm = cgen()->masm();
// Argument is passed in r1. // Argument is passed in r1.
enter()->Bind(); enter()->Bind();
VirtualFrame::SpilledScope spilled_scope; VirtualFrame::SpilledScope spilled_scope;
...@@ -2803,7 +2820,7 @@ void DeferredArrayLiteral::Generate() { ...@@ -2803,7 +2820,7 @@ void DeferredArrayLiteral::Generate() {
// If the entry is undefined we call the runtime system to computed // If the entry is undefined we call the runtime system to computed
// the literal. // the literal.
VirtualFrame* frame = generator()->frame(); VirtualFrame* frame = cgen()->frame();
// Literal array (0). // Literal array (0).
frame->EmitPush(r1); frame->EmitPush(r1);
// Literal index (1). // Literal index (1).
...@@ -2820,6 +2837,10 @@ void DeferredArrayLiteral::Generate() { ...@@ -2820,6 +2837,10 @@ void DeferredArrayLiteral::Generate() {
} }
#undef __
#define __ ACCESS_MASM(masm_)
void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) { void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) {
#ifdef DEBUG #ifdef DEBUG
int original_height = frame_->height(); int original_height = frame_->height();
...@@ -2827,7 +2848,7 @@ void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) { ...@@ -2827,7 +2848,7 @@ void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) {
VirtualFrame::SpilledScope spilled_scope; VirtualFrame::SpilledScope spilled_scope;
Comment cmnt(masm_, "[ ArrayLiteral"); Comment cmnt(masm_, "[ ArrayLiteral");
DeferredArrayLiteral* deferred = new DeferredArrayLiteral(this, node); DeferredArrayLiteral* deferred = new DeferredArrayLiteral(node);
// Retrieve the literal array and check the allocated entry. // Retrieve the literal array and check the allocated entry.
......
...@@ -194,8 +194,7 @@ class CodeGenerator: public AstVisitor { ...@@ -194,8 +194,7 @@ class CodeGenerator: public AstVisitor {
// Accessors // Accessors
Scope* scope() const { return scope_; } Scope* scope() const { return scope_; }
// Clearing and generating deferred code. // Generating deferred code.
void ClearDeferred();
void ProcessDeferred(); void ProcessDeferred();
bool is_eval() { return is_eval_; } bool is_eval() { return is_eval_; }
......
...@@ -37,20 +37,20 @@ namespace internal { ...@@ -37,20 +37,20 @@ namespace internal {
void DeferredCode::SetEntryFrame(Result* arg) { void DeferredCode::SetEntryFrame(Result* arg) {
ASSERT(generator()->has_valid_frame()); ASSERT(cgen()->has_valid_frame());
generator()->frame()->Push(arg); cgen()->frame()->Push(arg);
enter()->set_entry_frame(new VirtualFrame(generator()->frame())); enter()->set_entry_frame(new VirtualFrame(cgen()->frame()));
*arg = generator()->frame()->Pop(); *arg = cgen()->frame()->Pop();
} }
void DeferredCode::SetEntryFrame(Result* arg0, Result* arg1) { void DeferredCode::SetEntryFrame(Result* arg0, Result* arg1) {
ASSERT(generator()->has_valid_frame()); ASSERT(cgen()->has_valid_frame());
generator()->frame()->Push(arg0); cgen()->frame()->Push(arg0);
generator()->frame()->Push(arg1); cgen()->frame()->Push(arg1);
enter()->set_entry_frame(new VirtualFrame(generator()->frame())); enter()->set_entry_frame(new VirtualFrame(cgen()->frame()));
*arg1 = generator()->frame()->Pop(); *arg1 = cgen()->frame()->Pop();
*arg0 = generator()->frame()->Pop(); *arg0 = cgen()->frame()->Pop();
} }
......
...@@ -45,32 +45,24 @@ namespace internal { ...@@ -45,32 +45,24 @@ namespace internal {
CodeGenerator* CodeGeneratorScope::top_ = NULL; CodeGenerator* CodeGeneratorScope::top_ = NULL;
DeferredCode::DeferredCode(CodeGenerator* generator) DeferredCode::DeferredCode() : exit_(JumpTarget::BIDIRECTIONAL) {
: generator_(generator), MacroAssembler* masm = cgen()->masm();
masm_(generator->masm()), statement_position_ = masm->current_statement_position();
exit_(JumpTarget::BIDIRECTIONAL), position_ = masm->current_position();
statement_position_(masm_->current_statement_position()),
position_(masm_->current_position()) {
generator->AddDeferred(this);
ASSERT(statement_position_ != RelocInfo::kNoPosition); ASSERT(statement_position_ != RelocInfo::kNoPosition);
ASSERT(position_ != RelocInfo::kNoPosition); ASSERT(position_ != RelocInfo::kNoPosition);
cgen()->AddDeferred(this);
#ifdef DEBUG #ifdef DEBUG
comment_ = ""; comment_ = "";
#endif #endif
} }
void CodeGenerator::ClearDeferred() {
for (int i = 0; i < deferred_.length(); i++) {
deferred_[i]->Clear();
}
}
void CodeGenerator::ProcessDeferred() { void CodeGenerator::ProcessDeferred() {
while (!deferred_.is_empty()) { while (!deferred_.is_empty()) {
DeferredCode* code = deferred_.RemoveLast(); DeferredCode* code = deferred_.RemoveLast();
MacroAssembler* masm = code->masm(); MacroAssembler* masm = code->cgen()->masm();
// Record position of deferred code stub. // Record position of deferred code stub.
masm->RecordStatementPosition(code->statement_position()); masm->RecordStatementPosition(code->statement_position());
if (code->position() != RelocInfo::kNoPosition) { if (code->position() != RelocInfo::kNoPosition) {
...@@ -80,7 +72,6 @@ void CodeGenerator::ProcessDeferred() { ...@@ -80,7 +72,6 @@ void CodeGenerator::ProcessDeferred() {
Comment cmnt(masm, code->comment()); Comment cmnt(masm, code->comment());
code->Generate(); code->Generate();
ASSERT(code->enter()->is_bound()); ASSERT(code->enter()->is_bound());
code->Clear();
} }
} }
......
...@@ -52,7 +52,6 @@ ...@@ -52,7 +52,6 @@
// CodeGenerator // CodeGenerator
// ~CodeGenerator // ~CodeGenerator
// ProcessDeferred // ProcessDeferred
// ClearDeferred
// GenCode // GenCode
// BuildBoilerplate // BuildBoilerplate
// ComputeCallInitialize // ComputeCallInitialize
...@@ -116,33 +115,17 @@ class CodeGeneratorScope BASE_EMBEDDED { ...@@ -116,33 +115,17 @@ class CodeGeneratorScope BASE_EMBEDDED {
}; };
// Use lazy compilation; defaults to true.
// NOTE: Do not remove non-lazy compilation until we can properly
// install extensions with lazy compilation enabled. At the
// moment, this doesn't work for the extensions in Google3,
// and we can only run the tests with --nolazy.
// Deferred code objects are small pieces of code that are compiled // Deferred code objects are small pieces of code that are compiled
// out of line. They are used to defer the compilation of uncommon // out of line. They are used to defer the compilation of uncommon
// paths thereby avoiding expensive jumps around uncommon code parts. // paths thereby avoiding expensive jumps around uncommon code parts.
class DeferredCode: public ZoneObject { class DeferredCode: public ZoneObject {
public: public:
explicit DeferredCode(CodeGenerator* generator); DeferredCode();
virtual ~DeferredCode() { } virtual ~DeferredCode() { }
virtual void Generate() = 0; virtual void Generate() = 0;
// Unuse the entry and exit targets, deallocating all virtual frames CodeGenerator* cgen() const { return CodeGeneratorScope::Current(); }
// held by them. It will be impossible to emit a (correct) jump
// into or out of the deferred code after clearing.
void Clear() {
enter_.Unuse();
exit_.Unuse();
}
MacroAssembler* masm() const { return masm_; }
CodeGenerator* generator() const { return generator_; }
// Set the virtual frame for entry to the deferred code as a // Set the virtual frame for entry to the deferred code as a
// snapshot of the code generator's current frame (plus additional // snapshot of the code generator's current frame (plus additional
...@@ -169,13 +152,11 @@ class DeferredCode: public ZoneObject { ...@@ -169,13 +152,11 @@ class DeferredCode: public ZoneObject {
void set_comment(const char* comment) { comment_ = comment; } void set_comment(const char* comment) { comment_ = comment; }
const char* comment() const { return comment_; } const char* comment() const { return comment_; }
#else #else
inline void set_comment(const char* comment) { } void set_comment(const char* comment) { }
const char* comment() const { return ""; } const char* comment() const { return ""; }
#endif #endif
protected: protected:
CodeGenerator* const generator_;
MacroAssembler* const masm_;
JumpTarget enter_; JumpTarget enter_;
JumpTarget exit_; JumpTarget exit_;
......
This diff is collapsed.
...@@ -333,8 +333,7 @@ class CodeGenerator: public AstVisitor { ...@@ -333,8 +333,7 @@ class CodeGenerator: public AstVisitor {
// Accessors // Accessors
Scope* scope() const { return scope_; } Scope* scope() const { return scope_; }
// Clearing and generating deferred code. // Generating deferred code.
void ClearDeferred();
void ProcessDeferred(); void ProcessDeferred();
bool is_eval() { return is_eval_; } bool is_eval() { return is_eval_; }
......
...@@ -333,8 +333,7 @@ class CodeGenerator: public AstVisitor { ...@@ -333,8 +333,7 @@ class CodeGenerator: public AstVisitor {
// Accessors // Accessors
Scope* scope() const { return scope_; } Scope* scope() const { return scope_; }
// Clearing and generating deferred code. // Generating deferred code.
void ClearDeferred();
void ProcessDeferred(); void ProcessDeferred();
bool is_eval() { return is_eval_; } bool is_eval() { return is_eval_; }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment