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_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 4103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4114 __ And(index, index, | 4114 __ And(index, index, |
4115 Operand(name->Hash() + NameDictionary::GetProbeOffset(i))); | 4115 Operand(name->Hash() + NameDictionary::GetProbeOffset(i))); |
4116 | 4116 |
4117 // Scale the index by multiplying by the entry size. | 4117 // Scale the index by multiplying by the entry size. |
4118 STATIC_ASSERT(NameDictionary::kEntrySize == 3); | 4118 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4119 __ dsll(at, index, 1); | 4119 __ dsll(at, index, 1); |
4120 __ Daddu(index, index, at); // index *= 3. | 4120 __ Daddu(index, index, at); // index *= 3. |
4121 | 4121 |
4122 Register entity_name = scratch0; | 4122 Register entity_name = scratch0; |
4123 // Having undefined at this place means the name is not contained. | 4123 // Having undefined at this place means the name is not contained. |
4124 DCHECK_EQ(kSmiTagSize, 1); | 4124 STATIC_ASSERT(kSmiTagSize == 1); |
4125 Register tmp = properties; | 4125 Register tmp = properties; |
4126 | 4126 |
4127 __ dsll(scratch0, index, kPointerSizeLog2); | 4127 __ dsll(scratch0, index, kPointerSizeLog2); |
4128 __ Daddu(tmp, properties, scratch0); | 4128 __ Daddu(tmp, properties, scratch0); |
4129 __ ld(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); | 4129 __ ld(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); |
4130 | 4130 |
4131 DCHECK(!tmp.is(entity_name)); | 4131 DCHECK(!tmp.is(entity_name)); |
4132 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); | 4132 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); |
4133 __ Branch(done, eq, entity_name, Operand(tmp)); | 4133 __ Branch(done, eq, entity_name, Operand(tmp)); |
4134 | 4134 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4204 // the hash in a separate instruction. The value hash + i + i * i is right | 4204 // the hash in a separate instruction. The value hash + i + i * i is right |
4205 // shifted in the following and instruction. | 4205 // shifted in the following and instruction. |
4206 DCHECK(NameDictionary::GetProbeOffset(i) < | 4206 DCHECK(NameDictionary::GetProbeOffset(i) < |
4207 1 << (32 - Name::kHashFieldOffset)); | 4207 1 << (32 - Name::kHashFieldOffset)); |
4208 __ Daddu(scratch2, scratch2, Operand( | 4208 __ Daddu(scratch2, scratch2, Operand( |
4209 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 4209 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
4210 } | 4210 } |
4211 __ dsrl(scratch2, scratch2, Name::kHashShift); | 4211 __ dsrl(scratch2, scratch2, Name::kHashShift); |
4212 __ And(scratch2, scratch1, scratch2); | 4212 __ And(scratch2, scratch1, scratch2); |
4213 | 4213 |
4214 // Scale the index by multiplying by the element size. | 4214 // Scale the index by multiplying by the entry size. |
4215 DCHECK(NameDictionary::kEntrySize == 3); | 4215 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4216 // scratch2 = scratch2 * 3. | 4216 // scratch2 = scratch2 * 3. |
4217 | 4217 |
4218 __ dsll(at, scratch2, 1); | 4218 __ dsll(at, scratch2, 1); |
4219 __ Daddu(scratch2, scratch2, at); | 4219 __ Daddu(scratch2, scratch2, at); |
4220 | 4220 |
4221 // Check if the key is identical to the name. | 4221 // Check if the key is identical to the name. |
4222 __ dsll(at, scratch2, kPointerSizeLog2); | 4222 __ dsll(at, scratch2, kPointerSizeLog2); |
4223 __ Daddu(scratch2, elements, at); | 4223 __ Daddu(scratch2, elements, at); |
4224 __ ld(at, FieldMemOperand(scratch2, kElementsStartOffset)); | 4224 __ ld(at, FieldMemOperand(scratch2, kElementsStartOffset)); |
4225 __ Branch(done, eq, name, Operand(at)); | 4225 __ Branch(done, eq, name, Operand(at)); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4292 1 << (32 - Name::kHashFieldOffset)); | 4292 1 << (32 - Name::kHashFieldOffset)); |
4293 __ Daddu(index, hash, Operand( | 4293 __ Daddu(index, hash, Operand( |
4294 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 4294 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
4295 } else { | 4295 } else { |
4296 __ mov(index, hash); | 4296 __ mov(index, hash); |
4297 } | 4297 } |
4298 __ dsrl(index, index, Name::kHashShift); | 4298 __ dsrl(index, index, Name::kHashShift); |
4299 __ And(index, mask, index); | 4299 __ And(index, mask, index); |
4300 | 4300 |
4301 // Scale the index by multiplying by the entry size. | 4301 // Scale the index by multiplying by the entry size. |
4302 DCHECK(NameDictionary::kEntrySize == 3); | 4302 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4303 // index *= 3. | 4303 // index *= 3. |
4304 __ mov(at, index); | 4304 __ mov(at, index); |
4305 __ dsll(index, index, 1); | 4305 __ dsll(index, index, 1); |
4306 __ Daddu(index, index, at); | 4306 __ Daddu(index, index, at); |
4307 | 4307 |
4308 | 4308 |
4309 DCHECK_EQ(kSmiTagSize, 1); | 4309 STATIC_ASSERT(kSmiTagSize == 1); |
4310 __ dsll(index, index, kPointerSizeLog2); | 4310 __ dsll(index, index, kPointerSizeLog2); |
4311 __ Daddu(index, index, dictionary); | 4311 __ Daddu(index, index, dictionary); |
4312 __ ld(entry_key, FieldMemOperand(index, kElementsStartOffset)); | 4312 __ ld(entry_key, FieldMemOperand(index, kElementsStartOffset)); |
4313 | 4313 |
4314 // Having undefined at this place means the name is not contained. | 4314 // Having undefined at this place means the name is not contained. |
4315 __ Branch(¬_in_dictionary, eq, entry_key, Operand(undefined)); | 4315 __ Branch(¬_in_dictionary, eq, entry_key, Operand(undefined)); |
4316 | 4316 |
4317 // Stop if found the property. | 4317 // Stop if found the property. |
4318 __ Branch(&in_dictionary, eq, entry_key, Operand(key)); | 4318 __ Branch(&in_dictionary, eq, entry_key, Operand(key)); |
4319 | 4319 |
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5022 | 5022 |
5023 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, | 5023 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, |
5024 AllocationSiteOverrideMode mode) { | 5024 AllocationSiteOverrideMode mode) { |
5025 // a2 - allocation site (if mode != DISABLE_ALLOCATION_SITES) | 5025 // a2 - allocation site (if mode != DISABLE_ALLOCATION_SITES) |
5026 // a3 - kind (if mode != DISABLE_ALLOCATION_SITES) | 5026 // a3 - kind (if mode != DISABLE_ALLOCATION_SITES) |
5027 // a0 - number of arguments | 5027 // a0 - number of arguments |
5028 // a1 - constructor? | 5028 // a1 - constructor? |
5029 // sp[0] - last argument | 5029 // sp[0] - last argument |
5030 Label normal_sequence; | 5030 Label normal_sequence; |
5031 if (mode == DONT_OVERRIDE) { | 5031 if (mode == DONT_OVERRIDE) { |
5032 DCHECK(FAST_SMI_ELEMENTS == 0); | 5032 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
5033 DCHECK(FAST_HOLEY_SMI_ELEMENTS == 1); | 5033 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
5034 DCHECK(FAST_ELEMENTS == 2); | 5034 STATIC_ASSERT(FAST_ELEMENTS == 2); |
5035 DCHECK(FAST_HOLEY_ELEMENTS == 3); | 5035 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
5036 DCHECK(FAST_DOUBLE_ELEMENTS == 4); | 5036 STATIC_ASSERT(FAST_DOUBLE_ELEMENTS == 4); |
5037 DCHECK(FAST_HOLEY_DOUBLE_ELEMENTS == 5); | 5037 STATIC_ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); |
5038 | 5038 |
5039 // is the low bit set? If so, we are holey and that is good. | 5039 // is the low bit set? If so, we are holey and that is good. |
5040 __ And(at, a3, Operand(1)); | 5040 __ And(at, a3, Operand(1)); |
5041 __ Branch(&normal_sequence, ne, at, Operand(zero_reg)); | 5041 __ Branch(&normal_sequence, ne, at, Operand(zero_reg)); |
5042 } | 5042 } |
5043 // look at the first argument | 5043 // look at the first argument |
5044 __ ld(a5, MemOperand(sp, 0)); | 5044 __ ld(a5, MemOperand(sp, 0)); |
5045 __ Branch(&normal_sequence, eq, a5, Operand(zero_reg)); | 5045 __ Branch(&normal_sequence, eq, a5, Operand(zero_reg)); |
5046 | 5046 |
5047 if (mode == DISABLE_ALLOCATION_SITES) { | 5047 if (mode == DISABLE_ALLOCATION_SITES) { |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5609 MemOperand(fp, 6 * kPointerSize), NULL); | 5609 MemOperand(fp, 6 * kPointerSize), NULL); |
5610 } | 5610 } |
5611 | 5611 |
5612 | 5612 |
5613 #undef __ | 5613 #undef __ |
5614 | 5614 |
5615 } // namespace internal | 5615 } // namespace internal |
5616 } // namespace v8 | 5616 } // namespace v8 |
5617 | 5617 |
5618 #endif // V8_TARGET_ARCH_MIPS64 | 5618 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |