OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 if (index < 0) { | 587 if (index < 0) { |
588 // Set the property straight into the object. | 588 // Set the property straight into the object. |
589 int offset = object->map()->instance_size() + (index * kPointerSize); | 589 int offset = object->map()->instance_size() + (index * kPointerSize); |
590 if (FLAG_track_double_fields && representation.IsDouble()) { | 590 if (FLAG_track_double_fields && representation.IsDouble()) { |
591 __ sw(storage_reg, FieldMemOperand(receiver_reg, offset)); | 591 __ sw(storage_reg, FieldMemOperand(receiver_reg, offset)); |
592 } else { | 592 } else { |
593 __ sw(value_reg, FieldMemOperand(receiver_reg, offset)); | 593 __ sw(value_reg, FieldMemOperand(receiver_reg, offset)); |
594 } | 594 } |
595 | 595 |
596 if (!FLAG_track_fields || !representation.IsSmi()) { | 596 if (!FLAG_track_fields || !representation.IsSmi()) { |
597 // Skip updating write barrier if storing a smi. | |
598 __ JumpIfSmi(value_reg, &exit); | |
599 | |
600 // Update the write barrier for the array address. | 597 // Update the write barrier for the array address. |
601 // Pass the now unused name_reg as a scratch register. | 598 // Pass the now unused name_reg as a scratch register. |
602 if (!FLAG_track_double_fields || !representation.IsDouble()) { | 599 if (!FLAG_track_double_fields || !representation.IsDouble()) { |
603 __ mov(name_reg, value_reg); | 600 __ mov(name_reg, value_reg); |
604 } else { | 601 } else { |
605 ASSERT(storage_reg.is(name_reg)); | 602 ASSERT(storage_reg.is(name_reg)); |
606 } | 603 } |
607 __ RecordWriteField(receiver_reg, | 604 __ RecordWriteField(receiver_reg, |
608 offset, | 605 offset, |
609 name_reg, | 606 name_reg, |
610 scratch1, | 607 scratch1, |
611 kRAHasNotBeenSaved, | 608 kRAHasNotBeenSaved, |
612 kDontSaveFPRegs, | 609 kDontSaveFPRegs, |
613 EMIT_REMEMBERED_SET, | 610 EMIT_REMEMBERED_SET, |
614 smi_check); | 611 smi_check); |
615 } | 612 } |
616 } else { | 613 } else { |
617 // Write to the properties array. | 614 // Write to the properties array. |
618 int offset = index * kPointerSize + FixedArray::kHeaderSize; | 615 int offset = index * kPointerSize + FixedArray::kHeaderSize; |
619 // Get the properties array | 616 // Get the properties array |
620 __ lw(scratch1, | 617 __ lw(scratch1, |
621 FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset)); | 618 FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset)); |
622 if (FLAG_track_double_fields && representation.IsDouble()) { | 619 if (FLAG_track_double_fields && representation.IsDouble()) { |
623 __ sw(storage_reg, FieldMemOperand(scratch1, offset)); | 620 __ sw(storage_reg, FieldMemOperand(scratch1, offset)); |
624 } else { | 621 } else { |
625 __ sw(value_reg, FieldMemOperand(scratch1, offset)); | 622 __ sw(value_reg, FieldMemOperand(scratch1, offset)); |
626 } | 623 } |
627 | 624 |
628 if (!FLAG_track_fields || !representation.IsSmi()) { | 625 if (!FLAG_track_fields || !representation.IsSmi()) { |
629 // Skip updating write barrier if storing a smi. | |
630 __ JumpIfSmi(value_reg, &exit); | |
631 | |
632 // Update the write barrier for the array address. | 626 // Update the write barrier for the array address. |
633 // Ok to clobber receiver_reg and name_reg, since we return. | 627 // Ok to clobber receiver_reg and name_reg, since we return. |
634 if (!FLAG_track_double_fields || !representation.IsDouble()) { | 628 if (!FLAG_track_double_fields || !representation.IsDouble()) { |
635 __ mov(name_reg, value_reg); | 629 __ mov(name_reg, value_reg); |
636 } else { | 630 } else { |
637 ASSERT(storage_reg.is(name_reg)); | 631 ASSERT(storage_reg.is(name_reg)); |
638 } | 632 } |
639 __ RecordWriteField(scratch1, | 633 __ RecordWriteField(scratch1, |
640 offset, | 634 offset, |
641 name_reg, | 635 name_reg, |
(...skipping 3193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3835 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 3829 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |
3836 } | 3830 } |
3837 } | 3831 } |
3838 | 3832 |
3839 | 3833 |
3840 #undef __ | 3834 #undef __ |
3841 | 3835 |
3842 } } // namespace v8::internal | 3836 } } // namespace v8::internal |
3843 | 3837 |
3844 #endif // V8_TARGET_ARCH_MIPS | 3838 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |