Index: src/mips/stub-cache-mips.cc |
diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc |
index 23ef6ece97ea53c6463a48e40c07286fb37b250e..e5cb2001c580ff905899f79b79b3a90e885a1cdd 100644 |
--- a/src/mips/stub-cache-mips.cc |
+++ b/src/mips/stub-cache-mips.cc |
@@ -1556,6 +1556,78 @@ Handle<Code> CallStubCompiler::CompileCallField(Handle<JSObject> object, |
} |
+Handle<Code> CallStubCompiler::CompileArrayPopCall( |
+ Handle<Object> object, |
+ Handle<JSObject> holder, |
+ Handle<Cell> cell, |
+ Handle<JSFunction> function, |
+ Handle<String> name, |
+ Code::StubType type) { |
+ // If object is not an array or is observed or sealed, bail out to regular |
+ // call. |
+ if (!object->IsJSArray() || |
+ !cell.is_null() || |
+ Handle<JSArray>::cast(object)->map()->is_observed() || |
+ !Handle<JSArray>::cast(object)->map()->is_extensible()) { |
+ return Handle<Code>::null(); |
+ } |
+ |
+ Label miss, return_undefined, call_builtin; |
+ Register receiver = a0; |
+ Register scratch = a1; |
+ Register elements = a3; |
+ HandlerFrontendHeader(object, holder, name, RECEIVER_MAP_CHECK, &miss); |
+ |
+ // Get the elements array of the object. |
+ __ lw(elements, FieldMemOperand(receiver, JSArray::kElementsOffset)); |
+ |
+ // Check that the elements are in fast mode and writable. |
+ __ CheckMap(elements, |
+ scratch, |
+ Heap::kFixedArrayMapRootIndex, |
+ &call_builtin, |
+ DONT_DO_SMI_CHECK); |
+ |
+ // Get the array's length into t0 and calculate new length. |
+ __ lw(t0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
+ __ Subu(t0, t0, Operand(Smi::FromInt(1))); |
+ __ Branch(&return_undefined, lt, t0, Operand(zero_reg)); |
+ |
+ // Get the last element. |
+ __ LoadRoot(t2, Heap::kTheHoleValueRootIndex); |
+ STATIC_ASSERT(kSmiTagSize == 1); |
+ STATIC_ASSERT(kSmiTag == 0); |
+ // We can't address the last element in one operation. Compute the more |
+ // expensive shift first, and use an offset later on. |
+ __ sll(t1, t0, kPointerSizeLog2 - kSmiTagSize); |
+ __ Addu(elements, elements, t1); |
+ __ lw(scratch, FieldMemOperand(elements, FixedArray::kHeaderSize)); |
+ __ Branch(&call_builtin, eq, scratch, Operand(t2)); |
+ |
+ // Set the array's length. |
+ __ sw(t0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
+ |
+ // Fill with the hole. |
+ __ sw(t2, FieldMemOperand(elements, FixedArray::kHeaderSize)); |
+ const int argc = arguments().immediate(); |
+ __ mov(v0, scratch); |
+ __ DropAndRet(argc + 1); |
+ |
+ __ bind(&return_undefined); |
+ __ LoadRoot(v0, Heap::kUndefinedValueRootIndex); |
+ __ DropAndRet(argc + 1); |
+ |
+ __ bind(&call_builtin); |
+ __ TailCallExternalReference( |
+ ExternalReference(Builtins::c_ArrayPop, isolate()), argc + 1, 1); |
+ |
+ HandlerFrontendFooter(&miss); |
+ |
+ // Return the generated code. |
+ return GetCode(type, name); |
+} |
+ |
+ |
Handle<Code> CallStubCompiler::CompileFastApiCall( |
const CallOptimization& optimization, |
Handle<Object> object, |