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_ARM | 7 #if V8_TARGET_ARCH_ARM |
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 3877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3888 __ sub(index, index, Operand(1)); | 3888 __ sub(index, index, Operand(1)); |
3889 __ and_(index, index, Operand( | 3889 __ and_(index, index, Operand( |
3890 Smi::FromInt(name->Hash() + NameDictionary::GetProbeOffset(i)))); | 3890 Smi::FromInt(name->Hash() + NameDictionary::GetProbeOffset(i)))); |
3891 | 3891 |
3892 // Scale the index by multiplying by the entry size. | 3892 // Scale the index by multiplying by the entry size. |
3893 STATIC_ASSERT(NameDictionary::kEntrySize == 3); | 3893 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
3894 __ add(index, index, Operand(index, LSL, 1)); // index *= 3. | 3894 __ add(index, index, Operand(index, LSL, 1)); // index *= 3. |
3895 | 3895 |
3896 Register entity_name = scratch0; | 3896 Register entity_name = scratch0; |
3897 // Having undefined at this place means the name is not contained. | 3897 // Having undefined at this place means the name is not contained. |
3898 DCHECK_EQ(kSmiTagSize, 1); | 3898 STATIC_ASSERT(kSmiTagSize == 1); |
3899 Register tmp = properties; | 3899 Register tmp = properties; |
3900 __ add(tmp, properties, Operand(index, LSL, 1)); | 3900 __ add(tmp, properties, Operand(index, LSL, 1)); |
3901 __ ldr(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); | 3901 __ ldr(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); |
3902 | 3902 |
3903 DCHECK(!tmp.is(entity_name)); | 3903 DCHECK(!tmp.is(entity_name)); |
3904 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); | 3904 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); |
3905 __ cmp(entity_name, tmp); | 3905 __ cmp(entity_name, tmp); |
3906 __ b(eq, done); | 3906 __ b(eq, done); |
3907 | 3907 |
3908 // Load the hole ready for use below: | 3908 // Load the hole ready for use below: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3978 // Add the probe offset (i + i * i) left shifted to avoid right shifting | 3978 // Add the probe offset (i + i * i) left shifted to avoid right shifting |
3979 // the hash in a separate instruction. The value hash + i + i * i is right | 3979 // the hash in a separate instruction. The value hash + i + i * i is right |
3980 // shifted in the following and instruction. | 3980 // shifted in the following and instruction. |
3981 DCHECK(NameDictionary::GetProbeOffset(i) < | 3981 DCHECK(NameDictionary::GetProbeOffset(i) < |
3982 1 << (32 - Name::kHashFieldOffset)); | 3982 1 << (32 - Name::kHashFieldOffset)); |
3983 __ add(scratch2, scratch2, Operand( | 3983 __ add(scratch2, scratch2, Operand( |
3984 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 3984 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
3985 } | 3985 } |
3986 __ and_(scratch2, scratch1, Operand(scratch2, LSR, Name::kHashShift)); | 3986 __ and_(scratch2, scratch1, Operand(scratch2, LSR, Name::kHashShift)); |
3987 | 3987 |
3988 // Scale the index by multiplying by the element size. | 3988 // Scale the index by multiplying by the entry size. |
3989 DCHECK(NameDictionary::kEntrySize == 3); | 3989 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
3990 // scratch2 = scratch2 * 3. | 3990 // scratch2 = scratch2 * 3. |
3991 __ add(scratch2, scratch2, Operand(scratch2, LSL, 1)); | 3991 __ add(scratch2, scratch2, Operand(scratch2, LSL, 1)); |
3992 | 3992 |
3993 // Check if the key is identical to the name. | 3993 // Check if the key is identical to the name. |
3994 __ add(scratch2, elements, Operand(scratch2, LSL, 2)); | 3994 __ add(scratch2, elements, Operand(scratch2, LSL, 2)); |
3995 __ ldr(ip, FieldMemOperand(scratch2, kElementsStartOffset)); | 3995 __ ldr(ip, FieldMemOperand(scratch2, kElementsStartOffset)); |
3996 __ cmp(name, Operand(ip)); | 3996 __ cmp(name, Operand(ip)); |
3997 __ b(eq, done); | 3997 __ b(eq, done); |
3998 } | 3998 } |
3999 | 3999 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4063 DCHECK(NameDictionary::GetProbeOffset(i) < | 4063 DCHECK(NameDictionary::GetProbeOffset(i) < |
4064 1 << (32 - Name::kHashFieldOffset)); | 4064 1 << (32 - Name::kHashFieldOffset)); |
4065 __ add(index, hash, Operand( | 4065 __ add(index, hash, Operand( |
4066 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 4066 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
4067 } else { | 4067 } else { |
4068 __ mov(index, Operand(hash)); | 4068 __ mov(index, Operand(hash)); |
4069 } | 4069 } |
4070 __ and_(index, mask, Operand(index, LSR, Name::kHashShift)); | 4070 __ and_(index, mask, Operand(index, LSR, Name::kHashShift)); |
4071 | 4071 |
4072 // Scale the index by multiplying by the entry size. | 4072 // Scale the index by multiplying by the entry size. |
4073 DCHECK(NameDictionary::kEntrySize == 3); | 4073 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4074 __ add(index, index, Operand(index, LSL, 1)); // index *= 3. | 4074 __ add(index, index, Operand(index, LSL, 1)); // index *= 3. |
4075 | 4075 |
4076 DCHECK_EQ(kSmiTagSize, 1); | 4076 STATIC_ASSERT(kSmiTagSize == 1); |
4077 __ add(index, dictionary, Operand(index, LSL, 2)); | 4077 __ add(index, dictionary, Operand(index, LSL, 2)); |
4078 __ ldr(entry_key, FieldMemOperand(index, kElementsStartOffset)); | 4078 __ ldr(entry_key, FieldMemOperand(index, kElementsStartOffset)); |
4079 | 4079 |
4080 // Having undefined at this place means the name is not contained. | 4080 // Having undefined at this place means the name is not contained. |
4081 __ cmp(entry_key, Operand(undefined)); | 4081 __ cmp(entry_key, Operand(undefined)); |
4082 __ b(eq, ¬_in_dictionary); | 4082 __ b(eq, ¬_in_dictionary); |
4083 | 4083 |
4084 // Stop if found the property. | 4084 // Stop if found the property. |
4085 __ cmp(entry_key, Operand(key)); | 4085 __ cmp(entry_key, Operand(key)); |
4086 __ b(eq, &in_dictionary); | 4086 __ b(eq, &in_dictionary); |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4778 | 4778 |
4779 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, | 4779 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, |
4780 AllocationSiteOverrideMode mode) { | 4780 AllocationSiteOverrideMode mode) { |
4781 // r2 - allocation site (if mode != DISABLE_ALLOCATION_SITES) | 4781 // r2 - allocation site (if mode != DISABLE_ALLOCATION_SITES) |
4782 // r3 - kind (if mode != DISABLE_ALLOCATION_SITES) | 4782 // r3 - kind (if mode != DISABLE_ALLOCATION_SITES) |
4783 // r0 - number of arguments | 4783 // r0 - number of arguments |
4784 // r1 - constructor? | 4784 // r1 - constructor? |
4785 // sp[0] - last argument | 4785 // sp[0] - last argument |
4786 Label normal_sequence; | 4786 Label normal_sequence; |
4787 if (mode == DONT_OVERRIDE) { | 4787 if (mode == DONT_OVERRIDE) { |
4788 DCHECK(FAST_SMI_ELEMENTS == 0); | 4788 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
4789 DCHECK(FAST_HOLEY_SMI_ELEMENTS == 1); | 4789 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
4790 DCHECK(FAST_ELEMENTS == 2); | 4790 STATIC_ASSERT(FAST_ELEMENTS == 2); |
4791 DCHECK(FAST_HOLEY_ELEMENTS == 3); | 4791 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
4792 DCHECK(FAST_DOUBLE_ELEMENTS == 4); | 4792 STATIC_ASSERT(FAST_DOUBLE_ELEMENTS == 4); |
4793 DCHECK(FAST_HOLEY_DOUBLE_ELEMENTS == 5); | 4793 STATIC_ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); |
4794 | 4794 |
4795 // is the low bit set? If so, we are holey and that is good. | 4795 // is the low bit set? If so, we are holey and that is good. |
4796 __ tst(r3, Operand(1)); | 4796 __ tst(r3, Operand(1)); |
4797 __ b(ne, &normal_sequence); | 4797 __ b(ne, &normal_sequence); |
4798 } | 4798 } |
4799 | 4799 |
4800 // look at the first argument | 4800 // look at the first argument |
4801 __ ldr(r5, MemOperand(sp, 0)); | 4801 __ ldr(r5, MemOperand(sp, 0)); |
4802 __ cmp(r5, Operand::Zero()); | 4802 __ cmp(r5, Operand::Zero()); |
4803 __ b(eq, &normal_sequence); | 4803 __ b(eq, &normal_sequence); |
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5379 MemOperand(fp, 6 * kPointerSize), NULL); | 5379 MemOperand(fp, 6 * kPointerSize), NULL); |
5380 } | 5380 } |
5381 | 5381 |
5382 | 5382 |
5383 #undef __ | 5383 #undef __ |
5384 | 5384 |
5385 } // namespace internal | 5385 } // namespace internal |
5386 } // namespace v8 | 5386 } // namespace v8 |
5387 | 5387 |
5388 #endif // V8_TARGET_ARCH_ARM | 5388 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |