| Index: src/x64/full-codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/full-codegen-x64.cc (revision 11587)
|
| +++ src/x64/full-codegen-x64.cc (working copy)
|
| @@ -3360,102 +3360,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 = rax;
|
| - Register index_1 = rbx;
|
| - Register index_2 = rcx;
|
| - Register elements = rdi;
|
| - Register temp = rdx;
|
| - __ movq(object, Operand(rsp, 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.
|
| - __ CmpObjectType(object, JS_ARRAY_TYPE, temp);
|
| - __ j(not_equal, &slow_case);
|
| - __ testb(FieldOperand(temp, Map::kBitFieldOffset),
|
| - Immediate(KeyedLoadIC::kSlowCaseBitFieldMask));
|
| - __ j(not_zero, &slow_case);
|
| -
|
| - // Check the object's elements are in fast case and writable.
|
| - __ movq(elements, FieldOperand(object, JSObject::kElementsOffset));
|
| - __ CompareRoot(FieldOperand(elements, HeapObject::kMapOffset),
|
| - Heap::kFixedArrayMapRootIndex);
|
| - __ j(not_equal, &slow_case);
|
| -
|
| - // Check that both indices are smis.
|
| - __ movq(index_1, Operand(rsp, 1 * kPointerSize));
|
| - __ movq(index_2, Operand(rsp, 0 * kPointerSize));
|
| - __ JumpIfNotBothSmi(index_1, index_2, &slow_case);
|
| -
|
| - // Check that both indices are valid.
|
| - // The JSArray length field is a smi since the array is in fast case mode.
|
| - __ movq(temp, FieldOperand(object, JSArray::kLengthOffset));
|
| - __ SmiCompare(temp, index_1);
|
| - __ j(below_equal, &slow_case);
|
| - __ SmiCompare(temp, index_2);
|
| - __ j(below_equal, &slow_case);
|
| -
|
| - __ SmiToInteger32(index_1, index_1);
|
| - __ SmiToInteger32(index_2, index_2);
|
| - // Bring addresses into index1 and index2.
|
| - __ lea(index_1, FieldOperand(elements, index_1, times_pointer_size,
|
| - FixedArray::kHeaderSize));
|
| - __ lea(index_2, FieldOperand(elements, index_2, times_pointer_size,
|
| - FixedArray::kHeaderSize));
|
| -
|
| - // Swap elements. Use object and temp as scratch registers.
|
| - __ movq(object, Operand(index_1, 0));
|
| - __ movq(temp, Operand(index_2, 0));
|
| - __ movq(Operand(index_2, 0), object);
|
| - __ movq(Operand(index_1, 0), temp);
|
| -
|
| - Label no_remembered_set;
|
| - __ CheckPageFlag(elements,
|
| - temp,
|
| - 1 << MemoryChunk::SCAN_ON_SCAVENGE,
|
| - not_zero,
|
| - &no_remembered_set,
|
| - Label::kNear);
|
| - // 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,
|
| - index_1,
|
| - temp,
|
| - kDontSaveFPRegs,
|
| - MacroAssembler::kFallThroughAtEnd);
|
| - __ RememberedSetHelper(elements,
|
| - index_2,
|
| - temp,
|
| - kDontSaveFPRegs,
|
| - MacroAssembler::kFallThroughAtEnd);
|
| -
|
| - __ bind(&no_remembered_set);
|
| -
|
| - // We are done. Drop elements from the stack, and return undefined.
|
| - __ addq(rsp, Immediate(3 * kPointerSize));
|
| - __ LoadRoot(rax, Heap::kUndefinedValueRootIndex);
|
| - __ jmp(&done);
|
| -
|
| - __ bind(&slow_case);
|
| - __ CallRuntime(Runtime::kSwapElements, 3);
|
| -
|
| - __ bind(&done);
|
| - context()->Plug(rax);
|
| -}
|
| -
|
| -
|
| void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
|
| ZoneList<Expression*>* args = expr->arguments();
|
| ASSERT_EQ(2, args->length());
|
|
|