| Index: src/arm/full-codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/full-codegen-arm.cc (revision 11587)
|
| +++ src/arm/full-codegen-arm.cc (working copy)
|
| @@ -3466,104 +3466,6 @@
|
| }
|
|
|
|
|
| -void FullCodeGenerator::EmitSwapElements(CallRuntime* expr) {
|
| - ZoneList<Expression*>* args = expr->arguments();
|
| - ASSERT(args->length() == 3);
|
| - VisitForStackValue(args->at(0));
|
| - VisitForStackValue(args->at(1));
|
| - VisitForStackValue(args->at(2));
|
| - Label done;
|
| - Label slow_case;
|
| - Register object = r0;
|
| - Register index1 = r1;
|
| - Register index2 = r2;
|
| - Register elements = r3;
|
| - Register scratch1 = r4;
|
| - Register scratch2 = r5;
|
| -
|
| - __ ldr(object, MemOperand(sp, 2 * kPointerSize));
|
| - // Fetch the map and check if array is in fast case.
|
| - // Check that object doesn't require security checks and
|
| - // has no indexed interceptor.
|
| - __ CompareObjectType(object, scratch1, scratch2, JS_ARRAY_TYPE);
|
| - __ b(ne, &slow_case);
|
| - // Map is now in scratch1.
|
| -
|
| - __ ldrb(scratch2, FieldMemOperand(scratch1, Map::kBitFieldOffset));
|
| - __ tst(scratch2, Operand(KeyedLoadIC::kSlowCaseBitFieldMask));
|
| - __ b(ne, &slow_case);
|
| -
|
| - // Check the object's elements are in fast case and writable.
|
| - __ ldr(elements, FieldMemOperand(object, JSObject::kElementsOffset));
|
| - __ ldr(scratch1, FieldMemOperand(elements, HeapObject::kMapOffset));
|
| - __ LoadRoot(ip, Heap::kFixedArrayMapRootIndex);
|
| - __ cmp(scratch1, ip);
|
| - __ b(ne, &slow_case);
|
| -
|
| - // Check that both indices are smis.
|
| - __ ldr(index1, MemOperand(sp, 1 * kPointerSize));
|
| - __ ldr(index2, MemOperand(sp, 0));
|
| - __ JumpIfNotBothSmi(index1, index2, &slow_case);
|
| -
|
| - // Check that both indices are valid.
|
| - __ ldr(scratch1, FieldMemOperand(object, JSArray::kLengthOffset));
|
| - __ cmp(scratch1, index1);
|
| - __ cmp(scratch1, index2, hi);
|
| - __ b(ls, &slow_case);
|
| -
|
| - // Bring the address of the elements into index1 and index2.
|
| - __ add(scratch1, elements, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
|
| - __ add(index1,
|
| - scratch1,
|
| - Operand(index1, LSL, kPointerSizeLog2 - kSmiTagSize));
|
| - __ add(index2,
|
| - scratch1,
|
| - Operand(index2, LSL, kPointerSizeLog2 - kSmiTagSize));
|
| -
|
| - // Swap elements.
|
| - __ ldr(scratch1, MemOperand(index1, 0));
|
| - __ ldr(scratch2, MemOperand(index2, 0));
|
| - __ str(scratch1, MemOperand(index2, 0));
|
| - __ str(scratch2, MemOperand(index1, 0));
|
| -
|
| - Label no_remembered_set;
|
| - __ CheckPageFlag(elements,
|
| - scratch1,
|
| - 1 << MemoryChunk::SCAN_ON_SCAVENGE,
|
| - ne,
|
| - &no_remembered_set);
|
| - // Possible optimization: do a check that both values are Smis
|
| - // (or them and test against Smi mask.)
|
| -
|
| - // We are swapping two objects in an array and the incremental marker never
|
| - // pauses in the middle of scanning a single object. Therefore the
|
| - // incremental marker is not disturbed, so we don't need to call the
|
| - // RecordWrite stub that notifies the incremental marker.
|
| - __ RememberedSetHelper(elements,
|
| - index1,
|
| - scratch2,
|
| - kDontSaveFPRegs,
|
| - MacroAssembler::kFallThroughAtEnd);
|
| - __ RememberedSetHelper(elements,
|
| - index2,
|
| - scratch2,
|
| - kDontSaveFPRegs,
|
| - MacroAssembler::kFallThroughAtEnd);
|
| -
|
| - __ bind(&no_remembered_set);
|
| - // We are done. Drop elements from the stack, and return undefined.
|
| - __ Drop(3);
|
| - __ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
|
| - __ jmp(&done);
|
| -
|
| - __ bind(&slow_case);
|
| - __ CallRuntime(Runtime::kSwapElements, 3);
|
| -
|
| - __ bind(&done);
|
| - context()->Plug(r0);
|
| -}
|
| -
|
| -
|
| void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
|
| ZoneList<Expression*>* args = expr->arguments();
|
| ASSERT_EQ(2, args->length());
|
|
|