Chromium Code Reviews| 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 6659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6670 Label start; | 6670 Label start; |
| 6671 __ bind(&start); | 6671 __ bind(&start); |
| 6672 __ add(ip, pc, Operand(Assembler::kInstrSize)); | 6672 __ add(ip, pc, Operand(Assembler::kInstrSize)); |
| 6673 __ str(ip, MemOperand(sp, 0)); | 6673 __ str(ip, MemOperand(sp, 0)); |
| 6674 __ Jump(target); // Call the C++ function. | 6674 __ Jump(target); // Call the C++ function. |
| 6675 ASSERT_EQ(Assembler::kInstrSize + Assembler::kPcLoadDelta, | 6675 ASSERT_EQ(Assembler::kInstrSize + Assembler::kPcLoadDelta, |
| 6676 masm->SizeOfCodeGeneratedSince(&start)); | 6676 masm->SizeOfCodeGeneratedSince(&start)); |
| 6677 } | 6677 } |
| 6678 | 6678 |
| 6679 | 6679 |
| 6680 MaybeObject* StringDictionaryLookupStub::GenerateNegativeLookup( | 6680 void StringDictionaryLookupStub::GenerateNegativeLookup(MacroAssembler* masm, |
|
Kevin Millikin (Chromium)
2011/10/24 15:55:12
Cannot be wrapped with retry after GC, because it
Vyacheslav Egorov (Chromium)
2011/10/24 16:18:31
You can use create stub in the beginning of the fu
| |
| 6681 Label* miss, | |
| 6682 Label* done, | |
| 6683 Register receiver, | |
| 6684 Register properties, | |
| 6685 Handle<String> name, | |
| 6686 Register scratch0) { | |
| 6687 // If names of slots in range from 1 to kProbes - 1 for the hash value are | |
| 6688 // not equal to the name and kProbes-th slot is not used (its name is the | |
| 6689 // undefined value), it guarantees the hash table doesn't contain the | |
| 6690 // property. It's true even if some slots represent deleted properties | |
| 6691 // (their names are the null value). | |
| 6692 for (int i = 0; i < kInlinedProbes; i++) { | |
| 6693 // scratch0 points to properties hash. | |
| 6694 // Compute the masked index: (hash + i + i * i) & mask. | |
| 6695 Register index = scratch0; | |
| 6696 // Capacity is smi 2^n. | |
| 6697 __ ldr(index, FieldMemOperand(properties, kCapacityOffset)); | |
| 6698 __ sub(index, index, Operand(1)); | |
| 6699 __ and_(index, index, Operand( | |
| 6700 Smi::FromInt(name->Hash() + StringDictionary::GetProbeOffset(i)))); | |
| 6701 | |
| 6702 // Scale the index by multiplying by the entry size. | |
| 6703 ASSERT(StringDictionary::kEntrySize == 3); | |
| 6704 __ add(index, index, Operand(index, LSL, 1)); // index *= 3. | |
| 6705 | |
| 6706 Register entity_name = scratch0; | |
| 6707 // Having undefined at this place means the name is not contained. | |
| 6708 ASSERT_EQ(kSmiTagSize, 1); | |
| 6709 Register tmp = properties; | |
| 6710 __ add(tmp, properties, Operand(index, LSL, 1)); | |
| 6711 __ ldr(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); | |
| 6712 | |
| 6713 ASSERT(!tmp.is(entity_name)); | |
| 6714 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); | |
| 6715 __ cmp(entity_name, tmp); | |
| 6716 __ b(eq, done); | |
| 6717 | |
| 6718 if (i != kInlinedProbes - 1) { | |
| 6719 // Stop if found the property. | |
| 6720 __ cmp(entity_name, Operand(Handle<String>(name))); | |
| 6721 __ b(eq, miss); | |
| 6722 | |
| 6723 // Check if the entry name is not a symbol. | |
| 6724 __ ldr(entity_name, FieldMemOperand(entity_name, HeapObject::kMapOffset)); | |
| 6725 __ ldrb(entity_name, | |
| 6726 FieldMemOperand(entity_name, Map::kInstanceTypeOffset)); | |
| 6727 __ tst(entity_name, Operand(kIsSymbolMask)); | |
| 6728 __ b(eq, miss); | |
| 6729 | |
| 6730 // Restore the properties. | |
| 6731 __ ldr(properties, | |
| 6732 FieldMemOperand(receiver, JSObject::kPropertiesOffset)); | |
| 6733 } | |
| 6734 } | |
| 6735 | |
| 6736 const int spill_mask = | |
| 6737 (lr.bit() | r6.bit() | r5.bit() | r4.bit() | r3.bit() | | |
| 6738 r2.bit() | r1.bit() | r0.bit()); | |
| 6739 | |
| 6740 __ stm(db_w, sp, spill_mask); | |
| 6741 __ ldr(r0, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); | |
| 6742 __ mov(r1, Operand(Handle<String>(name))); | |
| 6743 StringDictionaryLookupStub stub(NEGATIVE_LOOKUP); | |
| 6744 __ CallStub(&stub); | |
|
Kevin Millikin (Chromium)
2011/10/24 15:55:12
This is the only change from the original function
| |
| 6745 __ tst(r0, Operand(r0)); | |
| 6746 __ ldm(ia_w, sp, spill_mask); | |
| 6747 | |
| 6748 __ b(eq, done); | |
| 6749 __ b(ne, miss); | |
| 6750 } | |
| 6751 | |
| 6752 | |
| 6753 // TODO(kmillikin): Eliminate this function when the stub cache is fully | |
| 6754 // handlified. | |
| 6755 MaybeObject* StringDictionaryLookupStub::TryGenerateNegativeLookup( | |
| 6681 MacroAssembler* masm, | 6756 MacroAssembler* masm, |
| 6682 Label* miss, | 6757 Label* miss, |
| 6683 Label* done, | 6758 Label* done, |
| 6684 Register receiver, | 6759 Register receiver, |
| 6685 Register properties, | 6760 Register properties, |
| 6686 String* name, | 6761 String* name, |
| 6687 Register scratch0) { | 6762 Register scratch0) { |
| 6688 // If names of slots in range from 1 to kProbes - 1 for the hash value are | 6763 // If names of slots in range from 1 to kProbes - 1 for the hash value are |
| 6689 // not equal to the name and kProbes-th slot is not used (its name is the | 6764 // not equal to the name and kProbes-th slot is not used (its name is the |
| 6690 // undefined value), it guarantees the hash table doesn't contain the | 6765 // undefined value), it guarantees the hash table doesn't contain the |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7177 __ bind(&need_incremental); | 7252 __ bind(&need_incremental); |
| 7178 | 7253 |
| 7179 // Fall through when we need to inform the incremental marker. | 7254 // Fall through when we need to inform the incremental marker. |
| 7180 } | 7255 } |
| 7181 | 7256 |
| 7182 #undef __ | 7257 #undef __ |
| 7183 | 7258 |
| 7184 } } // namespace v8::internal | 7259 } } // namespace v8::internal |
| 7185 | 7260 |
| 7186 #endif // V8_TARGET_ARCH_ARM | 7261 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |