Index: src/mips/ic-mips.cc |
=================================================================== |
--- src/mips/ic-mips.cc (revision 4138) |
+++ src/mips/ic-mips.cc (working copy) |
@@ -74,6 +74,47 @@ |
void CallIC::GenerateMiss(MacroAssembler* masm, int argc) { |
UNIMPLEMENTED_MIPS(); |
+ // Registers: |
+ // a2: name |
+ // ra: return address |
+ |
+ // Get the receiver of the function from the stack. |
+ __ lw(a3, MemOperand(sp, argc*kPointerSize)); |
+ |
+ __ EnterInternalFrame(); |
+ |
+ // Push the receiver and the name of the function. |
+ __ MultiPush(a2.bit() | a3.bit()); |
+ |
+ // Call the entry. |
+ __ li(a0, Operand(2)); |
+ __ li(a1, Operand(ExternalReference(IC_Utility(kCallIC_Miss)))); |
+ |
+ CEntryStub stub(1); |
+ __ CallStub(&stub); |
+ |
+ // Move result to r1 and leave the internal frame. |
+ __ mov(a1, v0); |
+ __ LeaveInternalFrame(); |
+ |
+ // Check if the receiver is a global object of some sort. |
+ Label invoke, global; |
+ __ lw(a2, MemOperand(sp, argc * kPointerSize)); |
+ __ andi(t0, a2, kSmiTagMask); |
+ __ Branch(eq, &invoke, t0, Operand(zero_reg)); |
+ __ GetObjectType(a2, a3, a3); |
+ __ Branch(eq, &global, a3, Operand(JS_GLOBAL_OBJECT_TYPE)); |
+ __ Branch(ne, &invoke, a3, Operand(JS_BUILTINS_OBJECT_TYPE)); |
+ |
+ // Patch the receiver on the stack. |
+ __ bind(&global); |
+ __ lw(a2, FieldMemOperand(a2, GlobalObject::kGlobalReceiverOffset)); |
+ __ sw(a2, MemOperand(sp, argc * kPointerSize)); |
+ |
+ // Invoke the function. |
+ ParameterCount actual(argc); |
+ __ bind(&invoke); |
+ __ InvokeFunction(a1, actual, JUMP_FUNCTION); |
} |
// Defined in ic.cc. |