| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 if (index < 0) { | 425 if (index < 0) { |
| 426 // Set the property straight into the object. | 426 // Set the property straight into the object. |
| 427 int offset = object->map()->instance_size() + (index * kPointerSize); | 427 int offset = object->map()->instance_size() + (index * kPointerSize); |
| 428 __ sw(a0, FieldMemOperand(receiver_reg, offset)); | 428 __ sw(a0, FieldMemOperand(receiver_reg, offset)); |
| 429 | 429 |
| 430 // Skip updating write barrier if storing a smi. | 430 // Skip updating write barrier if storing a smi. |
| 431 __ JumpIfSmi(a0, &exit, scratch); | 431 __ JumpIfSmi(a0, &exit, scratch); |
| 432 | 432 |
| 433 // Update the write barrier for the array address. | 433 // Update the write barrier for the array address. |
| 434 // Pass the now unused name_reg as a scratch register. | 434 // Pass the now unused name_reg as a scratch register. |
| 435 __ RecordWrite(receiver_reg, Operand(offset), name_reg, scratch); | 435 __ mov(name_reg, a0); |
| 436 __ RecordWriteField(receiver_reg, |
| 437 offset, |
| 438 name_reg, |
| 439 scratch, |
| 440 kRAHasNotBeenSaved, |
| 441 kDontSaveFPRegs); |
| 436 } else { | 442 } else { |
| 437 // Write to the properties array. | 443 // Write to the properties array. |
| 438 int offset = index * kPointerSize + FixedArray::kHeaderSize; | 444 int offset = index * kPointerSize + FixedArray::kHeaderSize; |
| 439 // Get the properties array. | 445 // Get the properties array. |
| 440 __ lw(scratch, FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset)); | 446 __ lw(scratch, FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset)); |
| 441 __ sw(a0, FieldMemOperand(scratch, offset)); | 447 __ sw(a0, FieldMemOperand(scratch, offset)); |
| 442 | 448 |
| 443 // Skip updating write barrier if storing a smi. | 449 // Skip updating write barrier if storing a smi. |
| 444 __ JumpIfSmi(a0, &exit); | 450 __ JumpIfSmi(a0, &exit); |
| 445 | 451 |
| 446 // Update the write barrier for the array address. | 452 // Update the write barrier for the array address. |
| 447 // Ok to clobber receiver_reg and name_reg, since we return. | 453 // Ok to clobber receiver_reg and name_reg, since we return. |
| 448 __ RecordWrite(scratch, Operand(offset), name_reg, receiver_reg); | 454 __ mov(name_reg, a0); |
| 455 __ RecordWriteField(scratch, |
| 456 offset, |
| 457 name_reg, |
| 458 receiver_reg, |
| 459 kRAHasNotBeenSaved, |
| 460 kDontSaveFPRegs); |
| 449 } | 461 } |
| 450 | 462 |
| 451 // Return the value (register v0). | 463 // Return the value (register v0). |
| 452 __ bind(&exit); | 464 __ bind(&exit); |
| 453 __ mov(v0, a0); | 465 __ mov(v0, a0); |
| 454 __ Ret(); | 466 __ Ret(); |
| 455 } | 467 } |
| 456 | 468 |
| 457 | 469 |
| 458 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { | 470 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { |
| (...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1582 __ lw(elements, FieldMemOperand(receiver, JSArray::kElementsOffset)); | 1594 __ lw(elements, FieldMemOperand(receiver, JSArray::kElementsOffset)); |
| 1583 | 1595 |
| 1584 // Check that the elements are in fast mode and writable. | 1596 // Check that the elements are in fast mode and writable. |
| 1585 __ CheckMap(elements, | 1597 __ CheckMap(elements, |
| 1586 v0, | 1598 v0, |
| 1587 Heap::kFixedArrayMapRootIndex, | 1599 Heap::kFixedArrayMapRootIndex, |
| 1588 &call_builtin, | 1600 &call_builtin, |
| 1589 DONT_DO_SMI_CHECK); | 1601 DONT_DO_SMI_CHECK); |
| 1590 | 1602 |
| 1591 if (argc == 1) { // Otherwise fall through to call the builtin. | 1603 if (argc == 1) { // Otherwise fall through to call the builtin. |
| 1592 Label exit, with_write_barrier, attempt_to_grow_elements; | 1604 Label exit, attempt_to_grow_elements; |
| 1593 | 1605 |
| 1594 // Get the array's length into v0 and calculate new length. | 1606 // Get the array's length into v0 and calculate new length. |
| 1595 __ lw(v0, FieldMemOperand(receiver, JSArray::kLengthOffset)); | 1607 __ lw(v0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
| 1596 STATIC_ASSERT(kSmiTagSize == 1); | 1608 STATIC_ASSERT(kSmiTagSize == 1); |
| 1597 STATIC_ASSERT(kSmiTag == 0); | 1609 STATIC_ASSERT(kSmiTag == 0); |
| 1598 __ Addu(v0, v0, Operand(Smi::FromInt(argc))); | 1610 __ Addu(v0, v0, Operand(Smi::FromInt(argc))); |
| 1599 | 1611 |
| 1600 // Get the element's length. | 1612 // Get the element's length. |
| 1601 __ lw(t0, FieldMemOperand(elements, FixedArray::kLengthOffset)); | 1613 __ lw(t0, FieldMemOperand(elements, FixedArray::kLengthOffset)); |
| 1602 | 1614 |
| 1603 // Check if we could survive without allocation. | 1615 // Check if we could survive without allocation. |
| 1604 __ Branch(&attempt_to_grow_elements, gt, v0, Operand(t0)); | 1616 __ Branch(&attempt_to_grow_elements, gt, v0, Operand(t0)); |
| 1605 | 1617 |
| 1606 // Save new length. | 1618 // Save new length. |
| 1607 __ sw(v0, FieldMemOperand(receiver, JSArray::kLengthOffset)); | 1619 __ sw(v0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
| 1608 | 1620 |
| 1609 // Push the element. | 1621 // Push the element. |
| 1610 __ lw(t0, MemOperand(sp, (argc - 1) * kPointerSize)); | 1622 __ lw(t0, MemOperand(sp, (argc - 1) * kPointerSize)); |
| 1611 // We may need a register containing the address end_elements below, | 1623 // We may need a register containing the address end_elements below, |
| 1612 // so write back the value in end_elements. | 1624 // so write back the value in end_elements. |
| 1613 __ sll(end_elements, v0, kPointerSizeLog2 - kSmiTagSize); | 1625 __ sll(end_elements, v0, kPointerSizeLog2 - kSmiTagSize); |
| 1614 __ Addu(end_elements, elements, end_elements); | 1626 __ Addu(end_elements, elements, end_elements); |
| 1615 const int kEndElementsOffset = | 1627 const int kEndElementsOffset = |
| 1616 FixedArray::kHeaderSize - kHeapObjectTag - argc * kPointerSize; | 1628 FixedArray::kHeaderSize - kHeapObjectTag - argc * kPointerSize; |
| 1617 __ Addu(end_elements, end_elements, kEndElementsOffset); | 1629 __ Addu(end_elements, end_elements, kEndElementsOffset); |
| 1618 __ sw(t0, MemOperand(end_elements)); | 1630 __ sw(t0, MemOperand(end_elements)); |
| 1619 | 1631 |
| 1620 // Check for a smi. | 1632 // Check for a smi. |
| 1633 Label with_write_barrier; |
| 1621 __ JumpIfNotSmi(t0, &with_write_barrier); | 1634 __ JumpIfNotSmi(t0, &with_write_barrier); |
| 1622 __ bind(&exit); | 1635 __ bind(&exit); |
| 1623 __ Drop(argc + 1); | 1636 __ Drop(argc + 1); |
| 1624 __ Ret(); | 1637 __ Ret(); |
| 1625 | 1638 |
| 1626 __ bind(&with_write_barrier); | 1639 __ bind(&with_write_barrier); |
| 1627 __ InNewSpace(elements, t0, eq, &exit); | 1640 __ RecordWrite(elements, |
| 1628 __ RecordWriteHelper(elements, end_elements, t0); | 1641 end_elements, |
| 1642 t0, |
| 1643 kRAHasNotBeenSaved, |
| 1644 kDontSaveFPRegs, |
| 1645 EMIT_REMEMBERED_SET, |
| 1646 OMIT_SMI_CHECK); |
| 1629 __ Drop(argc + 1); | 1647 __ Drop(argc + 1); |
| 1630 __ Ret(); | 1648 __ Ret(); |
| 1631 | 1649 |
| 1632 __ bind(&attempt_to_grow_elements); | 1650 __ bind(&attempt_to_grow_elements); |
| 1633 // v0: array's length + 1. | 1651 // v0: array's length + 1. |
| 1634 // t0: elements' length. | 1652 // t0: elements' length. |
| 1635 | 1653 |
| 1636 if (!FLAG_inline_new) { | 1654 if (!FLAG_inline_new) { |
| 1637 __ Branch(&call_builtin); | 1655 __ Branch(&call_builtin); |
| 1638 } | 1656 } |
| (...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2725 // to update the property details in the property dictionary of the | 2743 // to update the property details in the property dictionary of the |
| 2726 // global object. We bail out to the runtime system to do that. | 2744 // global object. We bail out to the runtime system to do that. |
| 2727 __ li(t0, Operand(Handle<JSGlobalPropertyCell>(cell))); | 2745 __ li(t0, Operand(Handle<JSGlobalPropertyCell>(cell))); |
| 2728 __ LoadRoot(t1, Heap::kTheHoleValueRootIndex); | 2746 __ LoadRoot(t1, Heap::kTheHoleValueRootIndex); |
| 2729 __ lw(t2, FieldMemOperand(t0, JSGlobalPropertyCell::kValueOffset)); | 2747 __ lw(t2, FieldMemOperand(t0, JSGlobalPropertyCell::kValueOffset)); |
| 2730 __ Branch(&miss, eq, t1, Operand(t2)); | 2748 __ Branch(&miss, eq, t1, Operand(t2)); |
| 2731 | 2749 |
| 2732 // Store the value in the cell. | 2750 // Store the value in the cell. |
| 2733 __ sw(a0, FieldMemOperand(t0, JSGlobalPropertyCell::kValueOffset)); | 2751 __ sw(a0, FieldMemOperand(t0, JSGlobalPropertyCell::kValueOffset)); |
| 2734 __ mov(v0, a0); // Stored value must be returned in v0. | 2752 __ mov(v0, a0); // Stored value must be returned in v0. |
| 2753 |
| 2754 // This trashes a0 but the value is returned in v0 anyway. |
| 2755 __ RecordWriteField(t0, |
| 2756 JSGlobalPropertyCell::kValueOffset, |
| 2757 a0, |
| 2758 a2, |
| 2759 kRAHasNotBeenSaved, |
| 2760 kDontSaveFPRegs, |
| 2761 OMIT_REMEMBERED_SET); |
| 2762 |
| 2735 Counters* counters = masm()->isolate()->counters(); | 2763 Counters* counters = masm()->isolate()->counters(); |
| 2736 __ IncrementCounter(counters->named_store_global_inline(), 1, a1, a3); | 2764 __ IncrementCounter(counters->named_store_global_inline(), 1, a1, a3); |
| 2737 __ Ret(); | 2765 __ Ret(); |
| 2738 | 2766 |
| 2739 // Handle store cache miss. | 2767 // Handle store cache miss. |
| 2740 __ bind(&miss); | 2768 __ bind(&miss); |
| 2741 __ IncrementCounter(counters->named_store_global_inline_miss(), 1, a1, a3); | 2769 __ IncrementCounter(counters->named_store_global_inline_miss(), 1, a1, a3); |
| 2742 Handle<Code> ic = masm()->isolate()->builtins()->StoreIC_Miss(); | 2770 Handle<Code> ic = masm()->isolate()->builtins()->StoreIC_Miss(); |
| 2743 __ Jump(ic, RelocInfo::CODE_TARGET); | 2771 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 2744 | 2772 |
| (...skipping 1608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4353 } else { | 4381 } else { |
| 4354 __ lw(scratch, FieldMemOperand(elements_reg, FixedArray::kLengthOffset)); | 4382 __ lw(scratch, FieldMemOperand(elements_reg, FixedArray::kLengthOffset)); |
| 4355 } | 4383 } |
| 4356 // Compare smis. | 4384 // Compare smis. |
| 4357 __ Branch(&miss_force_generic, hs, key_reg, Operand(scratch)); | 4385 __ Branch(&miss_force_generic, hs, key_reg, Operand(scratch)); |
| 4358 | 4386 |
| 4359 __ Addu(scratch, | 4387 __ Addu(scratch, |
| 4360 elements_reg, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 4388 elements_reg, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| 4361 STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize < kPointerSizeLog2); | 4389 STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize < kPointerSizeLog2); |
| 4362 __ sll(scratch2, key_reg, kPointerSizeLog2 - kSmiTagSize); | 4390 __ sll(scratch2, key_reg, kPointerSizeLog2 - kSmiTagSize); |
| 4363 __ Addu(scratch3, scratch2, scratch); | 4391 __ Addu(scratch, scratch, scratch2); |
| 4364 __ sw(value_reg, MemOperand(scratch3)); | 4392 __ sw(value_reg, MemOperand(scratch)); |
| 4365 __ RecordWrite(scratch, Operand(scratch2), receiver_reg , elements_reg); | 4393 __ mov(receiver_reg, value_reg); |
| 4394 __ RecordWrite(elements_reg, // Object. |
| 4395 scratch, // Address. |
| 4396 receiver_reg, // Value. |
| 4397 kRAHasNotBeenSaved, |
| 4398 kDontSaveFPRegs); |
| 4366 | 4399 |
| 4367 // value_reg (a0) is preserved. | 4400 // value_reg (a0) is preserved. |
| 4368 // Done. | 4401 // Done. |
| 4369 __ Ret(); | 4402 __ Ret(); |
| 4370 | 4403 |
| 4371 __ bind(&miss_force_generic); | 4404 __ bind(&miss_force_generic); |
| 4372 Handle<Code> ic = | 4405 Handle<Code> ic = |
| 4373 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 4406 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
| 4374 __ Jump(ic, RelocInfo::CODE_TARGET); | 4407 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 4375 } | 4408 } |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4502 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 4535 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
| 4503 __ Jump(ic, RelocInfo::CODE_TARGET); | 4536 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 4504 } | 4537 } |
| 4505 | 4538 |
| 4506 | 4539 |
| 4507 #undef __ | 4540 #undef __ |
| 4508 | 4541 |
| 4509 } } // namespace v8::internal | 4542 } } // namespace v8::internal |
| 4510 | 4543 |
| 4511 #endif // V8_TARGET_ARCH_MIPS | 4544 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |