Index: src/mips/full-codegen-mips.cc |
=================================================================== |
--- src/mips/full-codegen-mips.cc (revision 11587) |
+++ src/mips/full-codegen-mips.cc (working copy) |
@@ -3500,104 +3500,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 = a0; |
- Register index1 = a1; |
- Register index2 = a2; |
- Register elements = a3; |
- Register scratch1 = t0; |
- Register scratch2 = t1; |
- |
- __ lw(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. |
- __ GetObjectType(object, scratch1, scratch2); |
- __ Branch(&slow_case, ne, scratch2, Operand(JS_ARRAY_TYPE)); |
- // Map is now in scratch1. |
- |
- __ lbu(scratch2, FieldMemOperand(scratch1, Map::kBitFieldOffset)); |
- __ And(scratch2, scratch2, Operand(KeyedLoadIC::kSlowCaseBitFieldMask)); |
- __ Branch(&slow_case, ne, scratch2, Operand(zero_reg)); |
- |
- // Check the object's elements are in fast case and writable. |
- __ lw(elements, FieldMemOperand(object, JSObject::kElementsOffset)); |
- __ lw(scratch1, FieldMemOperand(elements, HeapObject::kMapOffset)); |
- __ LoadRoot(scratch2, Heap::kFixedArrayMapRootIndex); |
- __ Branch(&slow_case, ne, scratch1, Operand(scratch2)); |
- |
- // Check that both indices are smis. |
- __ lw(index1, MemOperand(sp, 1 * kPointerSize)); |
- __ lw(index2, MemOperand(sp, 0)); |
- __ JumpIfNotBothSmi(index1, index2, &slow_case); |
- |
- // Check that both indices are valid. |
- Label not_hi; |
- __ lw(scratch1, FieldMemOperand(object, JSArray::kLengthOffset)); |
- __ Branch(&slow_case, ls, scratch1, Operand(index1)); |
- __ Branch(¬_hi, NegateCondition(hi), scratch1, Operand(index1)); |
- __ Branch(&slow_case, ls, scratch1, Operand(index2)); |
- __ bind(¬_hi); |
- |
- // Bring the address of the elements into index1 and index2. |
- __ Addu(scratch1, elements, |
- Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
- __ sll(index1, index1, kPointerSizeLog2 - kSmiTagSize); |
- __ Addu(index1, scratch1, index1); |
- __ sll(index2, index2, kPointerSizeLog2 - kSmiTagSize); |
- __ Addu(index2, scratch1, index2); |
- |
- // Swap elements. |
- __ lw(scratch1, MemOperand(index1, 0)); |
- __ lw(scratch2, MemOperand(index2, 0)); |
- __ sw(scratch1, MemOperand(index2, 0)); |
- __ sw(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(v0, Heap::kUndefinedValueRootIndex); |
- __ jmp(&done); |
- |
- __ bind(&slow_case); |
- __ CallRuntime(Runtime::kSwapElements, 3); |
- |
- __ bind(&done); |
- context()->Plug(v0); |
-} |
- |
- |
void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) { |
ZoneList<Expression*>* args = expr->arguments(); |
ASSERT_EQ(2, args->length()); |