| Index: src/mips/virtual-frame-mips.cc
|
| ===================================================================
|
| --- src/mips/virtual-frame-mips.cc (revision 4229)
|
| +++ src/mips/virtual-frame-mips.cc (working copy)
|
| @@ -53,7 +53,12 @@
|
|
|
|
|
| void VirtualFrame::SyncRange(int begin, int end) {
|
| - UNIMPLEMENTED_MIPS();
|
| + // All elements are in memory on MIPS (ie, synced).
|
| +#ifdef DEBUG
|
| + for (int i = begin; i <= end; i++) {
|
| + ASSERT(elements_[i].is_synced());
|
| + }
|
| +#endif
|
| }
|
|
|
|
|
| @@ -63,7 +68,13 @@
|
|
|
|
|
| void VirtualFrame::Enter() {
|
| - UNIMPLEMENTED_MIPS();
|
| + // TODO(MIPS): Implement DEBUG
|
| +
|
| + // We are about to push four values to the frame.
|
| + Adjust(4);
|
| + __ MultiPush(ra.bit() | fp.bit() | cp.bit() | a1.bit());
|
| + // Adjust FP to point to saved FP.
|
| + __ addiu(fp, sp, 2 * kPointerSize);
|
| }
|
|
|
|
|
| @@ -73,7 +84,17 @@
|
|
|
|
|
| void VirtualFrame::AllocateStackSlots() {
|
| - UNIMPLEMENTED_MIPS();
|
| + int count = local_count();
|
| + if (count > 0) {
|
| + Comment cmnt(masm(), "[ Allocate space for locals");
|
| + Adjust(count);
|
| + // Initialize stack slots with 'undefined' value.
|
| + __ LoadRoot(t0, Heap::kUndefinedValueRootIndex);
|
| + __ addiu(sp, sp, -count * kPointerSize);
|
| + for (int i = 0; i < count; i++) {
|
| + __ sw(t0, MemOperand(sp, (count-i-1)*kPointerSize));
|
| + }
|
| + }
|
| }
|
|
|
|
|
| @@ -128,12 +149,16 @@
|
|
|
|
|
| void VirtualFrame::CallRuntime(Runtime::Function* f, int arg_count) {
|
| - UNIMPLEMENTED_MIPS();
|
| + PrepareForCall(arg_count, arg_count);
|
| + ASSERT(cgen()->HasValidEntryRegisters());
|
| + __ CallRuntime(f, arg_count);
|
| }
|
|
|
|
|
| void VirtualFrame::CallRuntime(Runtime::FunctionId id, int arg_count) {
|
| - UNIMPLEMENTED_MIPS();
|
| + PrepareForCall(arg_count, arg_count);
|
| + ASSERT(cgen()->HasValidEntryRegisters());
|
| + __ CallRuntime(id, arg_count);
|
| }
|
|
|
|
|
| @@ -155,16 +180,37 @@
|
| }
|
|
|
|
|
| -void VirtualFrame::RawCallCodeObject(Handle<Code> code,
|
| - RelocInfo::Mode rmode) {
|
| - UNIMPLEMENTED_MIPS();
|
| -}
|
| -
|
| -
|
| void VirtualFrame::CallCodeObject(Handle<Code> code,
|
| RelocInfo::Mode rmode,
|
| int dropped_args) {
|
| - UNIMPLEMENTED_MIPS();
|
| + switch (code->kind()) {
|
| + case Code::CALL_IC:
|
| + break;
|
| + case Code::FUNCTION:
|
| + UNIMPLEMENTED_MIPS();
|
| + break;
|
| + case Code::KEYED_LOAD_IC:
|
| + UNIMPLEMENTED_MIPS();
|
| + break;
|
| + case Code::LOAD_IC:
|
| + UNIMPLEMENTED_MIPS();
|
| + break;
|
| + case Code::KEYED_STORE_IC:
|
| + UNIMPLEMENTED_MIPS();
|
| + break;
|
| + case Code::STORE_IC:
|
| + UNIMPLEMENTED_MIPS();
|
| + break;
|
| + case Code::BUILTIN:
|
| + UNIMPLEMENTED_MIPS();
|
| + break;
|
| + default:
|
| + UNREACHABLE();
|
| + break;
|
| + }
|
| + Forget(dropped_args);
|
| + ASSERT(cgen()->HasValidEntryRegisters());
|
| + __ Call(code, rmode);
|
| }
|
|
|
|
|
| @@ -187,7 +233,24 @@
|
|
|
|
|
| void VirtualFrame::Drop(int count) {
|
| - UNIMPLEMENTED_MIPS();
|
| + ASSERT(count >= 0);
|
| + ASSERT(height() >= count);
|
| + int num_virtual_elements = (element_count() - 1) - stack_pointer_;
|
| +
|
| + // Emit code to lower the stack pointer if necessary.
|
| + if (num_virtual_elements < count) {
|
| + int num_dropped = count - num_virtual_elements;
|
| + stack_pointer_ -= num_dropped;
|
| + __ addiu(sp, sp, num_dropped * kPointerSize);
|
| + }
|
| +
|
| + // Discard elements from the virtual frame and free any registers.
|
| + for (int i = 0; i < count; i++) {
|
| + FrameElement dropped = elements_.RemoveLast();
|
| + if (dropped.is_register()) {
|
| + Unuse(dropped.reg());
|
| + }
|
| + }
|
| }
|
|
|
|
|
| @@ -199,27 +262,50 @@
|
| Result VirtualFrame::Pop() {
|
| UNIMPLEMENTED_MIPS();
|
| Result res = Result();
|
| - return res; // UNIMPLEMENTED RETUR
|
| + return res; // UNIMPLEMENTED RETURN
|
| }
|
|
|
|
|
| void VirtualFrame::EmitPop(Register reg) {
|
| - UNIMPLEMENTED_MIPS();
|
| + ASSERT(stack_pointer_ == element_count() - 1);
|
| + stack_pointer_--;
|
| + elements_.RemoveLast();
|
| + __ Pop(reg);
|
| }
|
|
|
| +
|
| void VirtualFrame::EmitMultiPop(RegList regs) {
|
| - UNIMPLEMENTED_MIPS();
|
| + ASSERT(stack_pointer_ == element_count() - 1);
|
| + for (int16_t i = 0; i < kNumRegisters; i++) {
|
| + if ((regs & (1 << i)) != 0) {
|
| + stack_pointer_--;
|
| + elements_.RemoveLast();
|
| + }
|
| + }
|
| + __ MultiPop(regs);
|
| }
|
|
|
|
|
| void VirtualFrame::EmitPush(Register reg) {
|
| - UNIMPLEMENTED_MIPS();
|
| + ASSERT(stack_pointer_ == element_count() - 1);
|
| + elements_.Add(FrameElement::MemoryElement(NumberInfo::Unknown()));
|
| + stack_pointer_++;
|
| + __ Push(reg);
|
| }
|
|
|
| +
|
| void VirtualFrame::EmitMultiPush(RegList regs) {
|
| - UNIMPLEMENTED_MIPS();
|
| + ASSERT(stack_pointer_ == element_count() - 1);
|
| + for (int16_t i = kNumRegisters; i > 0; i--) {
|
| + if ((regs & (1 << i)) != 0) {
|
| + elements_.Add(FrameElement::MemoryElement(NumberInfo::Unknown()));
|
| + stack_pointer_++;
|
| + }
|
| + }
|
| + __ MultiPush(regs);
|
| }
|
|
|
| +
|
| void VirtualFrame::EmitArgumentSlots(RegList reglist) {
|
| UNIMPLEMENTED_MIPS();
|
| }
|
|
|