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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 3955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3966 // Compute the masked index: (hash + i + i * i) & mask. | 3966 // Compute the masked index: (hash + i + i * i) & mask. |
3967 Register index = r0; | 3967 Register index = r0; |
3968 // Capacity is smi 2^n. | 3968 // Capacity is smi 2^n. |
3969 __ mov(index, FieldOperand(properties, kCapacityOffset)); | 3969 __ mov(index, FieldOperand(properties, kCapacityOffset)); |
3970 __ dec(index); | 3970 __ dec(index); |
3971 __ and_(index, | 3971 __ and_(index, |
3972 Immediate(Smi::FromInt(name->Hash() + | 3972 Immediate(Smi::FromInt(name->Hash() + |
3973 NameDictionary::GetProbeOffset(i)))); | 3973 NameDictionary::GetProbeOffset(i)))); |
3974 | 3974 |
3975 // Scale the index by multiplying by the entry size. | 3975 // Scale the index by multiplying by the entry size. |
3976 DCHECK(NameDictionary::kEntrySize == 3); | 3976 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
3977 __ lea(index, Operand(index, index, times_2, 0)); // index *= 3. | 3977 __ lea(index, Operand(index, index, times_2, 0)); // index *= 3. |
3978 Register entity_name = r0; | 3978 Register entity_name = r0; |
3979 // Having undefined at this place means the name is not contained. | 3979 // Having undefined at this place means the name is not contained. |
3980 DCHECK_EQ(kSmiTagSize, 1); | 3980 STATIC_ASSERT(kSmiTagSize == 1); |
3981 __ mov(entity_name, Operand(properties, index, times_half_pointer_size, | 3981 __ mov(entity_name, Operand(properties, index, times_half_pointer_size, |
3982 kElementsStartOffset - kHeapObjectTag)); | 3982 kElementsStartOffset - kHeapObjectTag)); |
3983 __ cmp(entity_name, masm->isolate()->factory()->undefined_value()); | 3983 __ cmp(entity_name, masm->isolate()->factory()->undefined_value()); |
3984 __ j(equal, done); | 3984 __ j(equal, done); |
3985 | 3985 |
3986 // Stop if found the property. | 3986 // Stop if found the property. |
3987 __ cmp(entity_name, Handle<Name>(name)); | 3987 __ cmp(entity_name, Handle<Name>(name)); |
3988 __ j(equal, miss); | 3988 __ j(equal, miss); |
3989 | 3989 |
3990 Label good; | 3990 Label good; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4038 for (int i = 0; i < kInlinedProbes; i++) { | 4038 for (int i = 0; i < kInlinedProbes; i++) { |
4039 // Compute the masked index: (hash + i + i * i) & mask. | 4039 // Compute the masked index: (hash + i + i * i) & mask. |
4040 __ mov(r0, FieldOperand(name, Name::kHashFieldOffset)); | 4040 __ mov(r0, FieldOperand(name, Name::kHashFieldOffset)); |
4041 __ shr(r0, Name::kHashShift); | 4041 __ shr(r0, Name::kHashShift); |
4042 if (i > 0) { | 4042 if (i > 0) { |
4043 __ add(r0, Immediate(NameDictionary::GetProbeOffset(i))); | 4043 __ add(r0, Immediate(NameDictionary::GetProbeOffset(i))); |
4044 } | 4044 } |
4045 __ and_(r0, r1); | 4045 __ and_(r0, r1); |
4046 | 4046 |
4047 // Scale the index by multiplying by the entry size. | 4047 // Scale the index by multiplying by the entry size. |
4048 DCHECK(NameDictionary::kEntrySize == 3); | 4048 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4049 __ lea(r0, Operand(r0, r0, times_2, 0)); // r0 = r0 * 3 | 4049 __ lea(r0, Operand(r0, r0, times_2, 0)); // r0 = r0 * 3 |
4050 | 4050 |
4051 // Check if the key is identical to the name. | 4051 // Check if the key is identical to the name. |
4052 __ cmp(name, Operand(elements, | 4052 __ cmp(name, Operand(elements, |
4053 r0, | 4053 r0, |
4054 times_4, | 4054 times_4, |
4055 kElementsStartOffset - kHeapObjectTag)); | 4055 kElementsStartOffset - kHeapObjectTag)); |
4056 __ j(equal, done); | 4056 __ j(equal, done); |
4057 } | 4057 } |
4058 | 4058 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4101 // (their names are the null value). | 4101 // (their names are the null value). |
4102 for (int i = kInlinedProbes; i < kTotalProbes; i++) { | 4102 for (int i = kInlinedProbes; i < kTotalProbes; i++) { |
4103 // Compute the masked index: (hash + i + i * i) & mask. | 4103 // Compute the masked index: (hash + i + i * i) & mask. |
4104 __ mov(scratch, Operand(esp, 2 * kPointerSize)); | 4104 __ mov(scratch, Operand(esp, 2 * kPointerSize)); |
4105 if (i > 0) { | 4105 if (i > 0) { |
4106 __ add(scratch, Immediate(NameDictionary::GetProbeOffset(i))); | 4106 __ add(scratch, Immediate(NameDictionary::GetProbeOffset(i))); |
4107 } | 4107 } |
4108 __ and_(scratch, Operand(esp, 0)); | 4108 __ and_(scratch, Operand(esp, 0)); |
4109 | 4109 |
4110 // Scale the index by multiplying by the entry size. | 4110 // Scale the index by multiplying by the entry size. |
4111 DCHECK(NameDictionary::kEntrySize == 3); | 4111 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4112 __ lea(index(), Operand(scratch, scratch, times_2, 0)); // index *= 3. | 4112 __ lea(index(), Operand(scratch, scratch, times_2, 0)); // index *= 3. |
4113 | 4113 |
4114 // Having undefined at this place means the name is not contained. | 4114 // Having undefined at this place means the name is not contained. |
4115 DCHECK_EQ(kSmiTagSize, 1); | 4115 STATIC_ASSERT(kSmiTagSize == 1); |
4116 __ mov(scratch, Operand(dictionary(), index(), times_pointer_size, | 4116 __ mov(scratch, Operand(dictionary(), index(), times_pointer_size, |
4117 kElementsStartOffset - kHeapObjectTag)); | 4117 kElementsStartOffset - kHeapObjectTag)); |
4118 __ cmp(scratch, isolate()->factory()->undefined_value()); | 4118 __ cmp(scratch, isolate()->factory()->undefined_value()); |
4119 __ j(equal, ¬_in_dictionary); | 4119 __ j(equal, ¬_in_dictionary); |
4120 | 4120 |
4121 // Stop if found the property. | 4121 // Stop if found the property. |
4122 __ cmp(scratch, Operand(esp, 3 * kPointerSize)); | 4122 __ cmp(scratch, Operand(esp, 3 * kPointerSize)); |
4123 __ j(equal, &in_dictionary); | 4123 __ j(equal, &in_dictionary); |
4124 | 4124 |
4125 if (i != kTotalProbes - 1 && mode() == NEGATIVE_LOOKUP) { | 4125 if (i != kTotalProbes - 1 && mode() == NEGATIVE_LOOKUP) { |
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4816 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, | 4816 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, |
4817 AllocationSiteOverrideMode mode) { | 4817 AllocationSiteOverrideMode mode) { |
4818 // ebx - allocation site (if mode != DISABLE_ALLOCATION_SITES) | 4818 // ebx - allocation site (if mode != DISABLE_ALLOCATION_SITES) |
4819 // edx - kind (if mode != DISABLE_ALLOCATION_SITES) | 4819 // edx - kind (if mode != DISABLE_ALLOCATION_SITES) |
4820 // eax - number of arguments | 4820 // eax - number of arguments |
4821 // edi - constructor? | 4821 // edi - constructor? |
4822 // esp[0] - return address | 4822 // esp[0] - return address |
4823 // esp[4] - last argument | 4823 // esp[4] - last argument |
4824 Label normal_sequence; | 4824 Label normal_sequence; |
4825 if (mode == DONT_OVERRIDE) { | 4825 if (mode == DONT_OVERRIDE) { |
4826 DCHECK(FAST_SMI_ELEMENTS == 0); | 4826 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
4827 DCHECK(FAST_HOLEY_SMI_ELEMENTS == 1); | 4827 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
4828 DCHECK(FAST_ELEMENTS == 2); | 4828 STATIC_ASSERT(FAST_ELEMENTS == 2); |
4829 DCHECK(FAST_HOLEY_ELEMENTS == 3); | 4829 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
4830 DCHECK(FAST_DOUBLE_ELEMENTS == 4); | 4830 STATIC_ASSERT(FAST_DOUBLE_ELEMENTS == 4); |
4831 DCHECK(FAST_HOLEY_DOUBLE_ELEMENTS == 5); | 4831 STATIC_ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); |
4832 | 4832 |
4833 // is the low bit set? If so, we are holey and that is good. | 4833 // is the low bit set? If so, we are holey and that is good. |
4834 __ test_b(edx, 1); | 4834 __ test_b(edx, 1); |
4835 __ j(not_zero, &normal_sequence); | 4835 __ j(not_zero, &normal_sequence); |
4836 } | 4836 } |
4837 | 4837 |
4838 // look at the first argument | 4838 // look at the first argument |
4839 __ mov(ecx, Operand(esp, kPointerSize)); | 4839 __ mov(ecx, Operand(esp, kPointerSize)); |
4840 __ test(ecx, ecx); | 4840 __ test(ecx, ecx); |
4841 __ j(zero, &normal_sequence); | 4841 __ j(zero, &normal_sequence); |
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5504 Operand(ebp, 7 * kPointerSize), NULL); | 5504 Operand(ebp, 7 * kPointerSize), NULL); |
5505 } | 5505 } |
5506 | 5506 |
5507 | 5507 |
5508 #undef __ | 5508 #undef __ |
5509 | 5509 |
5510 } // namespace internal | 5510 } // namespace internal |
5511 } // namespace v8 | 5511 } // namespace v8 |
5512 | 5512 |
5513 #endif // V8_TARGET_ARCH_IA32 | 5513 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |