Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 #include "v8.h" | 7 #include "v8.h" |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_MIPS | 9 #if V8_TARGET_ARCH_MIPS |
| 10 | 10 |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 372 __ Branch(&rt_call, ne, t4, Operand(MAP_TYPE)); | 372 __ Branch(&rt_call, ne, t4, Operand(MAP_TYPE)); |
| 373 | 373 |
| 374 // Check that the constructor is not constructing a JSFunction (see | 374 // Check that the constructor is not constructing a JSFunction (see |
| 375 // comments in Runtime_NewObject in runtime.cc). In which case the | 375 // comments in Runtime_NewObject in runtime.cc). In which case the |
| 376 // initial map's instance type would be JS_FUNCTION_TYPE. | 376 // initial map's instance type would be JS_FUNCTION_TYPE. |
| 377 // a1: constructor function | 377 // a1: constructor function |
| 378 // a2: initial map | 378 // a2: initial map |
| 379 __ lbu(a3, FieldMemOperand(a2, Map::kInstanceTypeOffset)); | 379 __ lbu(a3, FieldMemOperand(a2, Map::kInstanceTypeOffset)); |
| 380 __ Branch(&rt_call, eq, a3, Operand(JS_FUNCTION_TYPE)); | 380 __ Branch(&rt_call, eq, a3, Operand(JS_FUNCTION_TYPE)); |
| 381 | 381 |
| 382 // Use t7 to hold undefined, which is used in several places below. | |
| 383 __ LoadRoot(t7, Heap::kUndefinedValueRootIndex); | |
| 384 | |
| 385 if (!is_api_function) { | 382 if (!is_api_function) { |
| 386 Label allocate; | 383 Label allocate; |
| 387 MemOperand bit_field3 = FieldMemOperand(a2, Map::kBitField3Offset); | 384 MemOperand bit_field3 = FieldMemOperand(a2, Map::kBitField3Offset); |
| 388 // Check if slack tracking is enabled. | 385 // Check if slack tracking is enabled. |
| 389 __ lw(t0, bit_field3); | 386 __ lw(t0, bit_field3); |
| 390 __ DecodeField<Map::ConstructionCount>(t2, t0); | 387 __ DecodeField<Map::ConstructionCount>(t2, t0); |
| 391 __ Branch(&allocate, eq, t2, Operand(JSFunction::kNoSlackTracking)); | 388 __ Branch(&allocate, eq, t2, Operand(JSFunction::kNoSlackTracking)); |
| 392 // Decrease generous allocation count. | 389 // Decrease generous allocation count. |
| 393 __ Subu(t0, t0, Operand(1 << Map::ConstructionCount::kShift)); | 390 __ Subu(t0, t0, Operand(1 << Map::ConstructionCount::kShift)); |
| 394 __ Branch(USE_DELAY_SLOT, | 391 __ Branch(USE_DELAY_SLOT, |
| 395 &allocate, ne, t2, Operand(JSFunction::kFinishSlackTracking)); | 392 &allocate, ne, t2, Operand(JSFunction::kFinishSlackTracking)); |
| 396 __ sw(t0, bit_field3); // In delay slot. | 393 __ sw(t0, bit_field3); // In delay slot. |
| 397 | 394 |
| 398 __ Push(a1, a2, a1); // a1 = Constructor. | 395 __ Push(a1, a2, a1); // a1 = Constructor. |
| 399 __ CallRuntime(Runtime::kHiddenFinalizeInstanceSize, 1); | 396 __ CallRuntime(Runtime::kHiddenFinalizeInstanceSize, 1); |
| 400 | 397 |
| 401 __ Pop(a1, a2); | 398 __ Pop(a1, a2); |
| 399 ASSERT(JSFunction::kNoSlackTracking == 0); | |
| 400 __ mov(t2, zero_reg); | |
|
Paul Lind
2014/05/23 19:18:05
Can we add a comment here: // Slack tracking count
kilvadyb
2014/05/23 19:30:38
Done.
| |
| 402 | 401 |
| 403 __ bind(&allocate); | 402 __ bind(&allocate); |
| 404 } | 403 } |
| 405 | 404 |
| 406 // Now allocate the JSObject on the heap. | 405 // Now allocate the JSObject on the heap. |
| 407 // a1: constructor function | 406 // a1: constructor function |
| 408 // a2: initial map | 407 // a2: initial map |
| 409 __ lbu(a3, FieldMemOperand(a2, Map::kInstanceSizeOffset)); | 408 __ lbu(a3, FieldMemOperand(a2, Map::kInstanceSizeOffset)); |
| 410 if (create_memento) { | 409 if (create_memento) { |
| 411 __ Addu(a3, a3, Operand(AllocationMemento::kSize / kPointerSize)); | 410 __ Addu(a3, a3, Operand(AllocationMemento::kSize / kPointerSize)); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 431 | 430 |
| 432 // Fill all the in-object properties with appropriate filler. | 431 // Fill all the in-object properties with appropriate filler. |
| 433 // a1: constructor function | 432 // a1: constructor function |
| 434 // a2: initial map | 433 // a2: initial map |
| 435 // a3: object size (in words, including memento if create_memento) | 434 // a3: object size (in words, including memento if create_memento) |
| 436 // t4: JSObject (not tagged) | 435 // t4: JSObject (not tagged) |
| 437 // t5: First in-object property of JSObject (not tagged) | 436 // t5: First in-object property of JSObject (not tagged) |
| 438 // t2: slack tracking counter (non-API function case) | 437 // t2: slack tracking counter (non-API function case) |
| 439 ASSERT_EQ(3 * kPointerSize, JSObject::kHeaderSize); | 438 ASSERT_EQ(3 * kPointerSize, JSObject::kHeaderSize); |
| 440 | 439 |
| 440 // Use t7 to hold undefined, which is used in several places below. | |
| 441 __ LoadRoot(t7, Heap::kUndefinedValueRootIndex); | |
| 442 | |
| 441 if (!is_api_function) { | 443 if (!is_api_function) { |
| 442 Label no_inobject_slack_tracking; | 444 Label no_inobject_slack_tracking; |
| 443 | 445 |
| 444 // Check if slack tracking is enabled. | 446 // Check if slack tracking is enabled. |
| 445 __ Branch(&no_inobject_slack_tracking, | 447 __ Branch(&no_inobject_slack_tracking, |
| 446 eq, t2, Operand(JSFunction::kNoSlackTracking)); | 448 eq, t2, Operand(JSFunction::kNoSlackTracking)); |
| 447 | 449 |
| 448 // Allocate object with a slack. | 450 // Allocate object with a slack. |
| 449 __ lbu(a0, FieldMemOperand(a2, Map::kPreAllocatedPropertyFieldsOffset)); | 451 __ lbu(a0, FieldMemOperand(a2, Map::kPreAllocatedPropertyFieldsOffset)); |
| 450 __ sll(at, a0, kPointerSizeLog2); | 452 __ sll(at, a0, kPointerSizeLog2); |
| (...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1568 __ break_(0xCC); | 1570 __ break_(0xCC); |
| 1569 } | 1571 } |
| 1570 } | 1572 } |
| 1571 | 1573 |
| 1572 | 1574 |
| 1573 #undef __ | 1575 #undef __ |
| 1574 | 1576 |
| 1575 } } // namespace v8::internal | 1577 } } // namespace v8::internal |
| 1576 | 1578 |
| 1577 #endif // V8_TARGET_ARCH_MIPS | 1579 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |