OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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_PPC | 7 #if V8_TARGET_ARCH_PPC |
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 4194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 __ addi(scratch2, scratch2, | 4208 __ addi(scratch2, scratch2, |
4209 Operand(NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 4209 Operand(NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
4210 } | 4210 } |
4211 __ srwi(scratch2, scratch2, Operand(Name::kHashShift)); | 4211 __ srwi(scratch2, scratch2, Operand(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 element size. |
4215 DCHECK(NameDictionary::kEntrySize == 3); | 4215 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4216 // scratch2 = scratch2 * 3. | 4216 // scratch2 = scratch2 * 3. |
4217 __ ShiftLeftImm(ip, scratch2, Operand(1)); | 4217 __ ShiftLeftImm(ip, scratch2, Operand(1)); |
4218 __ add(scratch2, scratch2, ip); | 4218 __ add(scratch2, scratch2, ip); |
4219 | 4219 |
4220 // Check if the key is identical to the name. | 4220 // Check if the key is identical to the name. |
4221 __ ShiftLeftImm(ip, scratch2, Operand(kPointerSizeLog2)); | 4221 __ ShiftLeftImm(ip, scratch2, Operand(kPointerSizeLog2)); |
4222 __ add(scratch2, elements, ip); | 4222 __ add(scratch2, elements, ip); |
4223 __ LoadP(ip, FieldMemOperand(scratch2, kElementsStartOffset)); | 4223 __ LoadP(ip, FieldMemOperand(scratch2, kElementsStartOffset)); |
4224 __ cmp(name, ip); | 4224 __ cmp(name, ip); |
4225 __ beq(done); | 4225 __ beq(done); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4294 1 << (32 - Name::kHashFieldOffset)); | 4294 1 << (32 - Name::kHashFieldOffset)); |
4295 __ addi(index, hash, | 4295 __ addi(index, hash, |
4296 Operand(NameDictionary::GetProbeOffset(i) << Name::kHashShift)); | 4296 Operand(NameDictionary::GetProbeOffset(i) << Name::kHashShift)); |
4297 } else { | 4297 } else { |
4298 __ mr(index, hash); | 4298 __ mr(index, hash); |
4299 } | 4299 } |
4300 __ srwi(r0, index, Operand(Name::kHashShift)); | 4300 __ srwi(r0, index, Operand(Name::kHashShift)); |
4301 __ and_(index, mask, r0); | 4301 __ and_(index, mask, r0); |
4302 | 4302 |
4303 // Scale the index by multiplying by the entry size. | 4303 // Scale the index by multiplying by the entry size. |
4304 DCHECK(NameDictionary::kEntrySize == 3); | 4304 STATIC_ASSERT(NameDictionary::kEntrySize == 3); |
4305 __ ShiftLeftImm(scratch, index, Operand(1)); | 4305 __ ShiftLeftImm(scratch, index, Operand(1)); |
4306 __ add(index, index, scratch); // index *= 3. | 4306 __ add(index, index, scratch); // index *= 3. |
4307 | 4307 |
4308 __ ShiftLeftImm(scratch, index, Operand(kPointerSizeLog2)); | 4308 __ ShiftLeftImm(scratch, index, Operand(kPointerSizeLog2)); |
4309 __ add(index, dictionary, scratch); | 4309 __ add(index, dictionary, scratch); |
4310 __ LoadP(entry_key, FieldMemOperand(index, kElementsStartOffset)); | 4310 __ LoadP(entry_key, FieldMemOperand(index, kElementsStartOffset)); |
4311 | 4311 |
4312 // Having undefined at this place means the name is not contained. | 4312 // Having undefined at this place means the name is not contained. |
4313 __ cmp(entry_key, undefined); | 4313 __ cmp(entry_key, undefined); |
4314 __ beq(¬_in_dictionary); | 4314 __ beq(¬_in_dictionary); |
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5033 | 5033 |
5034 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, | 5034 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, |
5035 AllocationSiteOverrideMode mode) { | 5035 AllocationSiteOverrideMode mode) { |
5036 // r5 - allocation site (if mode != DISABLE_ALLOCATION_SITES) | 5036 // r5 - allocation site (if mode != DISABLE_ALLOCATION_SITES) |
5037 // r6 - kind (if mode != DISABLE_ALLOCATION_SITES) | 5037 // r6 - kind (if mode != DISABLE_ALLOCATION_SITES) |
5038 // r3 - number of arguments | 5038 // r3 - number of arguments |
5039 // r4 - constructor? | 5039 // r4 - constructor? |
5040 // sp[0] - last argument | 5040 // sp[0] - last argument |
5041 Label normal_sequence; | 5041 Label normal_sequence; |
5042 if (mode == DONT_OVERRIDE) { | 5042 if (mode == DONT_OVERRIDE) { |
5043 DCHECK(FAST_SMI_ELEMENTS == 0); | 5043 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
5044 DCHECK(FAST_HOLEY_SMI_ELEMENTS == 1); | 5044 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
5045 DCHECK(FAST_ELEMENTS == 2); | 5045 STATIC_ASSERT(FAST_ELEMENTS == 2); |
5046 DCHECK(FAST_HOLEY_ELEMENTS == 3); | 5046 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
5047 DCHECK(FAST_DOUBLE_ELEMENTS == 4); | 5047 STATIC_ASSERT(FAST_DOUBLE_ELEMENTS == 4); |
5048 DCHECK(FAST_HOLEY_DOUBLE_ELEMENTS == 5); | 5048 STATIC_ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); |
5049 | 5049 |
5050 // is the low bit set? If so, we are holey and that is good. | 5050 // is the low bit set? If so, we are holey and that is good. |
5051 __ andi(r0, r6, Operand(1)); | 5051 __ andi(r0, r6, Operand(1)); |
5052 __ bne(&normal_sequence, cr0); | 5052 __ bne(&normal_sequence, cr0); |
5053 } | 5053 } |
5054 | 5054 |
5055 // look at the first argument | 5055 // look at the first argument |
5056 __ LoadP(r8, MemOperand(sp, 0)); | 5056 __ LoadP(r8, MemOperand(sp, 0)); |
5057 __ cmpi(r8, Operand::Zero()); | 5057 __ cmpi(r8, Operand::Zero()); |
5058 __ beq(&normal_sequence); | 5058 __ beq(&normal_sequence); |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5673 kStackUnwindSpace, NULL, | 5673 kStackUnwindSpace, NULL, |
5674 MemOperand(fp, 6 * kPointerSize), NULL); | 5674 MemOperand(fp, 6 * kPointerSize), NULL); |
5675 } | 5675 } |
5676 | 5676 |
5677 | 5677 |
5678 #undef __ | 5678 #undef __ |
5679 } // namespace internal | 5679 } // namespace internal |
5680 } // namespace v8 | 5680 } // namespace v8 |
5681 | 5681 |
5682 #endif // V8_TARGET_ARCH_PPC | 5682 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |