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_MIPS | 7 #if V8_TARGET_ARCH_MIPS |
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 4071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4082 __ And(index, index, Operand( | 4082 __ And(index, index, Operand( |
4083 Smi::FromInt(name->Hash() + NameDictionary::GetProbeOffset(i)))); | 4083 Smi::FromInt(name->Hash() + NameDictionary::GetProbeOffset(i)))); |
4084 | 4084 |
4085 // Scale the index by multiplying by the entry size. | 4085 // Scale the index by multiplying by the entry size. |
4086 STATIC_ASSERT(NameDictionary::kEntrySize == 3); | 4086 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4087 __ sll(at, index, 1); | 4087 __ sll(at, index, 1); |
4088 __ Addu(index, index, at); | 4088 __ Addu(index, index, at); |
4089 | 4089 |
4090 Register entity_name = scratch0; | 4090 Register entity_name = scratch0; |
4091 // Having undefined at this place means the name is not contained. | 4091 // Having undefined at this place means the name is not contained. |
4092 DCHECK_EQ(kSmiTagSize, 1); | 4092 STATIC_ASSERT(kSmiTagSize == 1); |
4093 Register tmp = properties; | 4093 Register tmp = properties; |
4094 __ sll(scratch0, index, 1); | 4094 __ sll(scratch0, index, 1); |
4095 __ Addu(tmp, properties, scratch0); | 4095 __ Addu(tmp, properties, scratch0); |
4096 __ lw(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); | 4096 __ lw(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); |
4097 | 4097 |
4098 DCHECK(!tmp.is(entity_name)); | 4098 DCHECK(!tmp.is(entity_name)); |
4099 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); | 4099 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); |
4100 __ Branch(done, eq, entity_name, Operand(tmp)); | 4100 __ Branch(done, eq, entity_name, Operand(tmp)); |
4101 | 4101 |
4102 // Load the hole ready for use below: | 4102 // Load the hole ready for use below: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4172 // shifted in the following and instruction. | 4172 // shifted in the following and instruction. |
4173 DCHECK(NameDictionary::GetProbeOffset(i) < | 4173 DCHECK(NameDictionary::GetProbeOffset(i) < |
4174 1 << (32 - Name::kHashFieldOffset)); | 4174 1 << (32 - Name::kHashFieldOffset)); |
4175 __ Addu(scratch2, scratch2, Operand( | 4175 __ Addu(scratch2, scratch2, Operand( |
4176 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 4176 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
4177 } | 4177 } |
4178 __ srl(scratch2, scratch2, Name::kHashShift); | 4178 __ srl(scratch2, scratch2, Name::kHashShift); |
4179 __ And(scratch2, scratch1, scratch2); | 4179 __ And(scratch2, scratch1, scratch2); |
4180 | 4180 |
4181 // Scale the index by multiplying by the element size. | 4181 // Scale the index by multiplying by the element size. |
4182 DCHECK(NameDictionary::kEntrySize == 3); | 4182 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4183 // scratch2 = scratch2 * 3. | 4183 // scratch2 = scratch2 * 3. |
4184 | 4184 |
4185 __ sll(at, scratch2, 1); | 4185 __ sll(at, scratch2, 1); |
4186 __ Addu(scratch2, scratch2, at); | 4186 __ Addu(scratch2, scratch2, at); |
4187 | 4187 |
4188 // Check if the key is identical to the name. | 4188 // Check if the key is identical to the name. |
4189 __ sll(at, scratch2, 2); | 4189 __ sll(at, scratch2, 2); |
4190 __ Addu(scratch2, elements, at); | 4190 __ Addu(scratch2, elements, at); |
4191 __ lw(at, FieldMemOperand(scratch2, kElementsStartOffset)); | 4191 __ lw(at, FieldMemOperand(scratch2, kElementsStartOffset)); |
4192 __ Branch(done, eq, name, Operand(at)); | 4192 __ Branch(done, eq, name, Operand(at)); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4259 1 << (32 - Name::kHashFieldOffset)); | 4259 1 << (32 - Name::kHashFieldOffset)); |
4260 __ Addu(index, hash, Operand( | 4260 __ Addu(index, hash, Operand( |
4261 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 4261 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
4262 } else { | 4262 } else { |
4263 __ mov(index, hash); | 4263 __ mov(index, hash); |
4264 } | 4264 } |
4265 __ srl(index, index, Name::kHashShift); | 4265 __ srl(index, index, Name::kHashShift); |
4266 __ And(index, mask, index); | 4266 __ And(index, mask, index); |
4267 | 4267 |
4268 // Scale the index by multiplying by the entry size. | 4268 // Scale the index by multiplying by the entry size. |
4269 DCHECK(NameDictionary::kEntrySize == 3); | 4269 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4270 // index *= 3. | 4270 // index *= 3. |
4271 __ mov(at, index); | 4271 __ mov(at, index); |
4272 __ sll(index, index, 1); | 4272 __ sll(index, index, 1); |
4273 __ Addu(index, index, at); | 4273 __ Addu(index, index, at); |
4274 | 4274 |
4275 | 4275 |
4276 DCHECK_EQ(kSmiTagSize, 1); | 4276 STATIC_ASSERT(kSmiTagSize == 1); |
4277 __ sll(index, index, 2); | 4277 __ sll(index, index, 2); |
4278 __ Addu(index, index, dictionary); | 4278 __ Addu(index, index, dictionary); |
4279 __ lw(entry_key, FieldMemOperand(index, kElementsStartOffset)); | 4279 __ lw(entry_key, FieldMemOperand(index, kElementsStartOffset)); |
4280 | 4280 |
4281 // Having undefined at this place means the name is not contained. | 4281 // Having undefined at this place means the name is not contained. |
4282 __ Branch(¬_in_dictionary, eq, entry_key, Operand(undefined)); | 4282 __ Branch(¬_in_dictionary, eq, entry_key, Operand(undefined)); |
4283 | 4283 |
4284 // Stop if found the property. | 4284 // Stop if found the property. |
4285 __ Branch(&in_dictionary, eq, entry_key, Operand(key)); | 4285 __ Branch(&in_dictionary, eq, entry_key, Operand(key)); |
4286 | 4286 |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4990 | 4990 |
4991 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, | 4991 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, |
4992 AllocationSiteOverrideMode mode) { | 4992 AllocationSiteOverrideMode mode) { |
4993 // a2 - allocation site (if mode != DISABLE_ALLOCATION_SITES) | 4993 // a2 - allocation site (if mode != DISABLE_ALLOCATION_SITES) |
4994 // a3 - kind (if mode != DISABLE_ALLOCATION_SITES) | 4994 // a3 - kind (if mode != DISABLE_ALLOCATION_SITES) |
4995 // a0 - number of arguments | 4995 // a0 - number of arguments |
4996 // a1 - constructor? | 4996 // a1 - constructor? |
4997 // sp[0] - last argument | 4997 // sp[0] - last argument |
4998 Label normal_sequence; | 4998 Label normal_sequence; |
4999 if (mode == DONT_OVERRIDE) { | 4999 if (mode == DONT_OVERRIDE) { |
5000 DCHECK(FAST_SMI_ELEMENTS == 0); | 5000 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
5001 DCHECK(FAST_HOLEY_SMI_ELEMENTS == 1); | 5001 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
5002 DCHECK(FAST_ELEMENTS == 2); | 5002 STATIC_ASSERT(FAST_ELEMENTS == 2); |
5003 DCHECK(FAST_HOLEY_ELEMENTS == 3); | 5003 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
5004 DCHECK(FAST_DOUBLE_ELEMENTS == 4); | 5004 STATIC_ASSERT(FAST_DOUBLE_ELEMENTS == 4); |
5005 DCHECK(FAST_HOLEY_DOUBLE_ELEMENTS == 5); | 5005 STATIC_ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); |
5006 | 5006 |
5007 // is the low bit set? If so, we are holey and that is good. | 5007 // is the low bit set? If so, we are holey and that is good. |
5008 __ And(at, a3, Operand(1)); | 5008 __ And(at, a3, Operand(1)); |
5009 __ Branch(&normal_sequence, ne, at, Operand(zero_reg)); | 5009 __ Branch(&normal_sequence, ne, at, Operand(zero_reg)); |
5010 } | 5010 } |
5011 | 5011 |
5012 // look at the first argument | 5012 // look at the first argument |
5013 __ lw(t1, MemOperand(sp, 0)); | 5013 __ lw(t1, MemOperand(sp, 0)); |
5014 __ Branch(&normal_sequence, eq, t1, Operand(zero_reg)); | 5014 __ Branch(&normal_sequence, eq, t1, Operand(zero_reg)); |
5015 | 5015 |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5577 MemOperand(fp, 6 * kPointerSize), NULL); | 5577 MemOperand(fp, 6 * kPointerSize), NULL); |
5578 } | 5578 } |
5579 | 5579 |
5580 | 5580 |
5581 #undef __ | 5581 #undef __ |
5582 | 5582 |
5583 } // namespace internal | 5583 } // namespace internal |
5584 } // namespace v8 | 5584 } // namespace v8 |
5585 | 5585 |
5586 #endif // V8_TARGET_ARCH_MIPS | 5586 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |