Change the SpilledScope scope and ...AndSpill functions on ARM so that
they do nothing. The frame is currently always spilled, so they were not doing anything useful. The call sites have been left alone to mark where spills will eventually be needed if we begin doing register allocation on ARM. Review URL: http://codereview.chromium.org/164136 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2644 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
9edc69c72f
commit
90772fa427
@ -34,6 +34,37 @@ namespace internal {
|
|||||||
|
|
||||||
#define __ ACCESS_MASM(masm_)
|
#define __ ACCESS_MASM(masm_)
|
||||||
|
|
||||||
|
void CodeGenerator::LoadConditionAndSpill(Expression* expression,
|
||||||
|
TypeofState typeof_state,
|
||||||
|
JumpTarget* true_target,
|
||||||
|
JumpTarget* false_target,
|
||||||
|
bool force_control) {
|
||||||
|
LoadCondition(expression, typeof_state, true_target, false_target,
|
||||||
|
force_control);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CodeGenerator::LoadAndSpill(Expression* expression,
|
||||||
|
TypeofState typeof_state) {
|
||||||
|
Load(expression, typeof_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CodeGenerator::VisitAndSpill(Statement* statement) {
|
||||||
|
Visit(statement);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CodeGenerator::VisitStatementsAndSpill(ZoneList<Statement*>* statements) {
|
||||||
|
VisitStatements(statements);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Reference::GetValueAndSpill(TypeofState typeof_state) {
|
||||||
|
GetValue(typeof_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Platform-specific inline functions.
|
// Platform-specific inline functions.
|
||||||
|
|
||||||
void DeferredCode::Jump() { __ jmp(&entry_label_); }
|
void DeferredCode::Jump() { __ jmp(&entry_label_); }
|
||||||
|
@ -133,8 +133,7 @@ CodeGenerator::CodeGenerator(int buffer_size, Handle<Script> script,
|
|||||||
allocator_(NULL),
|
allocator_(NULL),
|
||||||
cc_reg_(al),
|
cc_reg_(al),
|
||||||
state_(NULL),
|
state_(NULL),
|
||||||
function_return_is_shadowed_(false),
|
function_return_is_shadowed_(false) {
|
||||||
in_spilled_code_(false) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -156,7 +155,6 @@ void CodeGenerator::GenCode(FunctionLiteral* fun) {
|
|||||||
ASSERT(frame_ == NULL);
|
ASSERT(frame_ == NULL);
|
||||||
frame_ = new VirtualFrame();
|
frame_ = new VirtualFrame();
|
||||||
cc_reg_ = al;
|
cc_reg_ = al;
|
||||||
set_in_spilled_code(false);
|
|
||||||
{
|
{
|
||||||
CodeGenState state(this);
|
CodeGenState state(this);
|
||||||
|
|
||||||
@ -423,22 +421,6 @@ MemOperand CodeGenerator::ContextSlotOperandCheckExtensions(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CodeGenerator::LoadConditionAndSpill(Expression* expression,
|
|
||||||
TypeofState typeof_state,
|
|
||||||
JumpTarget* true_target,
|
|
||||||
JumpTarget* false_target,
|
|
||||||
bool force_control) {
|
|
||||||
ASSERT(in_spilled_code());
|
|
||||||
set_in_spilled_code(false);
|
|
||||||
LoadCondition(expression, typeof_state, true_target, false_target,
|
|
||||||
force_control);
|
|
||||||
if (frame_ != NULL) {
|
|
||||||
frame_->SpillAll();
|
|
||||||
}
|
|
||||||
set_in_spilled_code(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Loads a value on TOS. If it is a boolean value, the result may have been
|
// Loads a value on TOS. If it is a boolean value, the result may have been
|
||||||
// (partially) translated into branches, or it may have set the condition
|
// (partially) translated into branches, or it may have set the condition
|
||||||
// code register. If force_cc is set, the value is forced to set the
|
// code register. If force_cc is set, the value is forced to set the
|
||||||
@ -450,7 +432,6 @@ void CodeGenerator::LoadCondition(Expression* x,
|
|||||||
JumpTarget* true_target,
|
JumpTarget* true_target,
|
||||||
JumpTarget* false_target,
|
JumpTarget* false_target,
|
||||||
bool force_cc) {
|
bool force_cc) {
|
||||||
ASSERT(!in_spilled_code());
|
|
||||||
ASSERT(!has_cc());
|
ASSERT(!has_cc());
|
||||||
int original_height = frame_->height();
|
int original_height = frame_->height();
|
||||||
|
|
||||||
@ -484,21 +465,10 @@ void CodeGenerator::LoadCondition(Expression* x,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CodeGenerator::LoadAndSpill(Expression* expression,
|
|
||||||
TypeofState typeof_state) {
|
|
||||||
ASSERT(in_spilled_code());
|
|
||||||
set_in_spilled_code(false);
|
|
||||||
Load(expression, typeof_state);
|
|
||||||
frame_->SpillAll();
|
|
||||||
set_in_spilled_code(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CodeGenerator::Load(Expression* x, TypeofState typeof_state) {
|
void CodeGenerator::Load(Expression* x, TypeofState typeof_state) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
int original_height = frame_->height();
|
int original_height = frame_->height();
|
||||||
#endif
|
#endif
|
||||||
ASSERT(!in_spilled_code());
|
|
||||||
JumpTarget true_target;
|
JumpTarget true_target;
|
||||||
JumpTarget false_target;
|
JumpTarget false_target;
|
||||||
LoadCondition(x, typeof_state, &true_target, &false_target, false);
|
LoadCondition(x, typeof_state, &true_target, &false_target, false);
|
||||||
@ -1146,28 +1116,6 @@ void CodeGenerator::CheckStack() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CodeGenerator::VisitAndSpill(Statement* statement) {
|
|
||||||
ASSERT(in_spilled_code());
|
|
||||||
set_in_spilled_code(false);
|
|
||||||
Visit(statement);
|
|
||||||
if (frame_ != NULL) {
|
|
||||||
frame_->SpillAll();
|
|
||||||
}
|
|
||||||
set_in_spilled_code(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CodeGenerator::VisitStatementsAndSpill(ZoneList<Statement*>* statements) {
|
|
||||||
ASSERT(in_spilled_code());
|
|
||||||
set_in_spilled_code(false);
|
|
||||||
VisitStatements(statements);
|
|
||||||
if (frame_ != NULL) {
|
|
||||||
frame_->SpillAll();
|
|
||||||
}
|
|
||||||
set_in_spilled_code(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CodeGenerator::VisitStatements(ZoneList<Statement*>* statements) {
|
void CodeGenerator::VisitStatements(ZoneList<Statement*>* statements) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
int original_height = frame_->height();
|
int original_height = frame_->height();
|
||||||
@ -1764,7 +1712,6 @@ void CodeGenerator::VisitForInStatement(ForInStatement* node) {
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
int original_height = frame_->height();
|
int original_height = frame_->height();
|
||||||
#endif
|
#endif
|
||||||
ASSERT(!in_spilled_code());
|
|
||||||
VirtualFrame::SpilledScope spilled_scope;
|
VirtualFrame::SpilledScope spilled_scope;
|
||||||
Comment cmnt(masm_, "[ ForInStatement");
|
Comment cmnt(masm_, "[ ForInStatement");
|
||||||
CodeForStatementPosition(node);
|
CodeForStatementPosition(node);
|
||||||
@ -2822,7 +2769,6 @@ void CodeGenerator::VisitCatchExtensionObject(CatchExtensionObject* node) {
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
int original_height = frame_->height();
|
int original_height = frame_->height();
|
||||||
#endif
|
#endif
|
||||||
ASSERT(!in_spilled_code());
|
|
||||||
VirtualFrame::SpilledScope spilled_scope;
|
VirtualFrame::SpilledScope spilled_scope;
|
||||||
// Call runtime routine to allocate the catch extension object and
|
// Call runtime routine to allocate the catch extension object and
|
||||||
// assign the exception value to the catch variable.
|
// assign the exception value to the catch variable.
|
||||||
@ -4158,17 +4104,7 @@ Handle<String> Reference::GetName() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Reference::GetValueAndSpill(TypeofState typeof_state) {
|
|
||||||
ASSERT(cgen_->in_spilled_code());
|
|
||||||
cgen_->set_in_spilled_code(false);
|
|
||||||
GetValue(typeof_state);
|
|
||||||
cgen_->frame()->SpillAll();
|
|
||||||
cgen_->set_in_spilled_code(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Reference::GetValue(TypeofState typeof_state) {
|
void Reference::GetValue(TypeofState typeof_state) {
|
||||||
ASSERT(!cgen_->in_spilled_code());
|
|
||||||
ASSERT(cgen_->HasValidEntryRegisters());
|
ASSERT(cgen_->HasValidEntryRegisters());
|
||||||
ASSERT(!is_illegal());
|
ASSERT(!is_illegal());
|
||||||
ASSERT(!cgen_->has_cc());
|
ASSERT(!cgen_->has_cc());
|
||||||
|
@ -183,9 +183,6 @@ class CodeGenerator: public AstVisitor {
|
|||||||
|
|
||||||
void AddDeferred(DeferredCode* code) { deferred_.Add(code); }
|
void AddDeferred(DeferredCode* code) { deferred_.Add(code); }
|
||||||
|
|
||||||
bool in_spilled_code() const { return in_spilled_code_; }
|
|
||||||
void set_in_spilled_code(bool flag) { in_spilled_code_ = flag; }
|
|
||||||
|
|
||||||
static const int kUnknownIntValue = -1;
|
static const int kUnknownIntValue = -1;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -222,11 +219,11 @@ class CodeGenerator: public AstVisitor {
|
|||||||
// reach the end of the statement (ie, it does not exit via break,
|
// reach the end of the statement (ie, it does not exit via break,
|
||||||
// continue, return, or throw). This function is used temporarily while
|
// continue, return, or throw). This function is used temporarily while
|
||||||
// the code generator is being transformed.
|
// the code generator is being transformed.
|
||||||
void VisitAndSpill(Statement* statement);
|
inline void VisitAndSpill(Statement* statement);
|
||||||
|
|
||||||
// Visit a list of statements and then spill the virtual frame if control
|
// Visit a list of statements and then spill the virtual frame if control
|
||||||
// flow can reach the end of the list.
|
// flow can reach the end of the list.
|
||||||
void VisitStatementsAndSpill(ZoneList<Statement*>* statements);
|
inline void VisitStatementsAndSpill(ZoneList<Statement*>* statements);
|
||||||
|
|
||||||
// Main code generation function
|
// Main code generation function
|
||||||
void GenCode(FunctionLiteral* fun);
|
void GenCode(FunctionLiteral* fun);
|
||||||
@ -263,17 +260,17 @@ class CodeGenerator: public AstVisitor {
|
|||||||
// Generate code to push the value of an expression on top of the frame
|
// Generate code to push the value of an expression on top of the frame
|
||||||
// and then spill the frame fully to memory. This function is used
|
// and then spill the frame fully to memory. This function is used
|
||||||
// temporarily while the code generator is being transformed.
|
// temporarily while the code generator is being transformed.
|
||||||
void LoadAndSpill(Expression* expression,
|
inline void LoadAndSpill(Expression* expression,
|
||||||
TypeofState typeof_state = NOT_INSIDE_TYPEOF);
|
TypeofState typeof_state = NOT_INSIDE_TYPEOF);
|
||||||
|
|
||||||
// Call LoadCondition and then spill the virtual frame unless control flow
|
// Call LoadCondition and then spill the virtual frame unless control flow
|
||||||
// cannot reach the end of the expression (ie, by emitting only
|
// cannot reach the end of the expression (ie, by emitting only
|
||||||
// unconditional jumps to the control targets).
|
// unconditional jumps to the control targets).
|
||||||
void LoadConditionAndSpill(Expression* expression,
|
inline void LoadConditionAndSpill(Expression* expression,
|
||||||
TypeofState typeof_state,
|
TypeofState typeof_state,
|
||||||
JumpTarget* true_target,
|
JumpTarget* true_target,
|
||||||
JumpTarget* false_target,
|
JumpTarget* false_target,
|
||||||
bool force_control);
|
bool force_control);
|
||||||
|
|
||||||
// Read a value from a slot and leave it on top of the expression stack.
|
// Read a value from a slot and leave it on top of the expression stack.
|
||||||
void LoadFromSlot(Slot* slot, TypeofState typeof_state);
|
void LoadFromSlot(Slot* slot, TypeofState typeof_state);
|
||||||
@ -405,12 +402,6 @@ class CodeGenerator: public AstVisitor {
|
|||||||
// to some unlinking code).
|
// to some unlinking code).
|
||||||
bool function_return_is_shadowed_;
|
bool function_return_is_shadowed_;
|
||||||
|
|
||||||
// True when we are in code that expects the virtual frame to be fully
|
|
||||||
// spilled. Some virtual frame function are disabled in DEBUG builds when
|
|
||||||
// called from spilled code, because they do not leave the virtual frame
|
|
||||||
// in a spilled state.
|
|
||||||
bool in_spilled_code_;
|
|
||||||
|
|
||||||
static InlineRuntimeLUT kInlineRuntimeLUT[];
|
static InlineRuntimeLUT kInlineRuntimeLUT[];
|
||||||
|
|
||||||
friend class VirtualFrame;
|
friend class VirtualFrame;
|
||||||
|
@ -52,20 +52,7 @@ class VirtualFrame : public ZoneObject {
|
|||||||
// generator is being transformed.
|
// generator is being transformed.
|
||||||
class SpilledScope BASE_EMBEDDED {
|
class SpilledScope BASE_EMBEDDED {
|
||||||
public:
|
public:
|
||||||
SpilledScope() : previous_state_(cgen()->in_spilled_code()) {
|
SpilledScope() {}
|
||||||
ASSERT(cgen()->has_valid_frame());
|
|
||||||
cgen()->frame()->SpillAll();
|
|
||||||
cgen()->set_in_spilled_code(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
~SpilledScope() {
|
|
||||||
cgen()->set_in_spilled_code(previous_state_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool previous_state_;
|
|
||||||
|
|
||||||
CodeGenerator* cgen() { return CodeGeneratorScope::Current(); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// An illegal index into the virtual frame.
|
// An illegal index into the virtual frame.
|
||||||
|
Loading…
Reference in New Issue
Block a user