Index: src/ia32/virtual-frame-ia32.h |
=================================================================== |
--- src/ia32/virtual-frame-ia32.h (revision 1990) |
+++ src/ia32/virtual-frame-ia32.h (working copy) |
@@ -50,9 +50,17 @@ |
// generator is being transformed. |
class SpilledScope BASE_EMBEDDED { |
public: |
- explicit SpilledScope(CodeGenerator* cgen); |
+ explicit SpilledScope(CodeGenerator* cgen) |
+ : cgen_(cgen), |
+ previous_state_(cgen->in_spilled_code()) { |
+ ASSERT(cgen->has_valid_frame()); |
+ cgen->frame()->SpillAll(); |
+ cgen->set_in_spilled_code(true); |
+ } |
- ~SpilledScope(); |
+ ~SpilledScope() { |
+ cgen_->set_in_spilled_code(previous_state_); |
+ } |
private: |
CodeGenerator* cgen_; |
@@ -98,7 +106,12 @@ |
// match an external frame effect (examples include a call removing |
// its arguments, and exiting a try/catch removing an exception |
// handler). No code will be emitted. |
- void Forget(int count); |
+ void Forget(int count) { |
+ ASSERT(count >= 0); |
+ ASSERT(stack_pointer_ == elements_.length() - 1); |
+ stack_pointer_ -= count; |
+ ForgetElements(count); |
+ } |
// Forget count elements from the top of the frame without adjusting |
// the stack pointer downward. This is used, for example, before |
@@ -109,7 +122,9 @@ |
void SpillAll(); |
// Spill all occurrences of a specific register from the frame. |
- void Spill(Register reg); |
+ void Spill(Register reg) { |
+ if (is_used(reg)) SpillElementAt(register_index(reg)); |
+ } |
// Spill all occurrences of an arbitrary register if possible. Return the |
// register spilled or no_reg if it was not possible to free any register |
@@ -270,7 +285,10 @@ |
// Call stub given the number of arguments it expects on (and |
// removes from) the stack. |
- Result CallStub(CodeStub* stub, int arg_count); |
+ Result CallStub(CodeStub* stub, int arg_count) { |
+ PrepareForCall(arg_count, arg_count); |
+ return RawCallStub(stub); |
+ } |
// Call stub that takes a single argument passed in eax. The |
// argument is given as a result which does not have to be eax or |
@@ -354,7 +372,15 @@ |
// Pushing a result invalidates it (its contents become owned by the |
// frame). |
- void Push(Result* result); |
+ void Push(Result* result) { |
+ if (result->is_register()) { |
+ Push(result->reg(), result->static_type()); |
+ } else { |
+ ASSERT(result->is_constant()); |
+ Push(result->handle()); |
+ } |
+ result->Unuse(); |
+ } |
// Nip removes zero or more elements from immediately below the top |
// of the frame, leaving the previous top-of-frame value on top of |
@@ -427,12 +453,20 @@ |
// Record an occurrence of a register in the virtual frame. This has the |
// effect of incrementing the register's external reference count and |
// of updating the index of the register's location in the frame. |
- void Use(Register reg, int index); |
+ void Use(Register reg, int index) { |
+ ASSERT(!is_used(reg)); |
+ register_locations_[reg.code()] = index; |
+ cgen_->allocator()->Use(reg); |
+ } |
// Record that a register reference has been dropped from the frame. This |
// decrements the register's external reference count and invalidates the |
// index of the register's location in the frame. |
- void Unuse(Register reg); |
+ void Unuse(Register reg) { |
+ ASSERT(register_locations_[reg.code()] != kIllegalIndex); |
+ register_locations_[reg.code()] = kIllegalIndex; |
+ cgen_->allocator()->Unuse(reg); |
+ } |
// Spill the element at a particular index---write it to memory if |
// necessary, free any associated register, and forget its value if |