Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #if V8_TARGET_ARCH_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
| 6 | 6 |
| 7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
| 8 #include "src/ic/ic.h" | 8 #include "src/ic/ic.h" |
| 9 #include "src/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
| 10 #include "src/interface-descriptors.h" | 10 #include "src/interface-descriptors.h" |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 40 uintptr_t map_off_addr = reinterpret_cast<uintptr_t>(map_offset.address()); | 40 uintptr_t map_off_addr = reinterpret_cast<uintptr_t>(map_offset.address()); |
| 41 | 41 |
| 42 Label miss; | 42 Label miss; |
| 43 | 43 |
| 44 DCHECK(!AreAliased(name, offset, scratch, scratch2, scratch3)); | 44 DCHECK(!AreAliased(name, offset, scratch, scratch2, scratch3)); |
| 45 | 45 |
| 46 // Multiply by 3 because there are 3 fields per entry. | 46 // Multiply by 3 because there are 3 fields per entry. |
| 47 __ Add(scratch3, offset, Operand(offset, LSL, 1)); | 47 __ Add(scratch3, offset, Operand(offset, LSL, 1)); |
| 48 | 48 |
| 49 // Calculate the base address of the entry. | 49 // Calculate the base address of the entry. |
| 50 __ Mov(scratch, key_offset); | 50 __ Mov(scratch, key_offset); |
|
Jakob Kummerow
2016/07/20 12:09:45
Why is this instruction even needed? Wouldn't it s
Igor Sheludko
2016/07/20 13:40:26
Unfortunately we don't have such an instruction on
Jakob Kummerow
2016/07/20 13:50:01
Argh, my mistake. Somehow I thought |key_offset| w
| |
| 51 __ Add(scratch, scratch, Operand(scratch3, LSL, kPointerSizeLog2)); | 51 __ Add( |
| 52 scratch, scratch, | |
| 53 Operand(scratch3, LSL, kPointerSizeLog2 - StubCache::kCacheIndexShift)); | |
| 52 | 54 |
| 53 // Check that the key in the entry matches the name. | 55 // Check that the key in the entry matches the name. |
| 54 __ Ldr(scratch2, MemOperand(scratch)); | 56 __ Ldr(scratch2, MemOperand(scratch)); |
| 55 __ Cmp(name, scratch2); | 57 __ Cmp(name, scratch2); |
| 56 __ B(ne, &miss); | 58 __ B(ne, &miss); |
| 57 | 59 |
| 58 // Check the map matches. | 60 // Check the map matches. |
| 59 __ Ldr(scratch2, MemOperand(scratch, map_off_addr - key_off_addr)); | 61 __ Ldr(scratch2, MemOperand(scratch, map_off_addr - key_off_addr)); |
| 60 __ Ldr(scratch3, FieldMemOperand(receiver, HeapObject::kMapOffset)); | 62 __ Ldr(scratch3, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
| 61 __ Cmp(scratch2, scratch3); | 63 __ Cmp(scratch2, scratch3); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 #endif | 123 #endif |
| 122 | 124 |
| 123 Counters* counters = masm->isolate()->counters(); | 125 Counters* counters = masm->isolate()->counters(); |
| 124 __ IncrementCounter(counters->megamorphic_stub_cache_probes(), 1, extra2, | 126 __ IncrementCounter(counters->megamorphic_stub_cache_probes(), 1, extra2, |
| 125 extra3); | 127 extra3); |
| 126 | 128 |
| 127 // Check that the receiver isn't a smi. | 129 // Check that the receiver isn't a smi. |
| 128 __ JumpIfSmi(receiver, &miss); | 130 __ JumpIfSmi(receiver, &miss); |
| 129 | 131 |
| 130 // Compute the hash for primary table. | 132 // Compute the hash for primary table. |
| 131 __ Ldr(scratch, FieldMemOperand(name, Name::kHashFieldOffset)); | 133 __ Ldr(scratch.W(), FieldMemOperand(name, Name::kHashFieldOffset)); |
| 132 __ Ldr(extra, FieldMemOperand(receiver, HeapObject::kMapOffset)); | 134 __ Ldr(extra, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
| 133 __ Add(scratch, scratch, extra); | 135 __ Add(scratch, scratch, extra); |
| 134 __ Eor(scratch, scratch, flags); | 136 __ Eor(scratch, scratch, flags); |
| 135 // We shift out the last two bits because they are not part of the hash. | 137 __ Mov(extra, Operand(kPrimaryTableSize - 1)); |
| 136 __ Ubfx(scratch, scratch, kCacheIndexShift, | 138 __ And(scratch, scratch, Operand(extra, LSL, kCacheIndexShift)); |
|
Jakob Kummerow
2016/07/20 12:09:45
IIUC, "And(scratch, scratch, Operand((kPrimaryTabl
Igor Sheludko
2016/07/20 13:40:26
Indeed. Done here and everywhere.
| |
| 137 CountTrailingZeros(kPrimaryTableSize, 64)); | |
| 138 | 139 |
| 139 // Probe the primary table. | 140 // Probe the primary table. |
| 140 ProbeTable(this, masm, flags, kPrimary, receiver, name, scratch, extra, | 141 ProbeTable(this, masm, flags, kPrimary, receiver, name, scratch, extra, |
| 141 extra2, extra3); | 142 extra2, extra3); |
| 142 | 143 |
| 143 // Primary miss: Compute hash for secondary table. | 144 // Primary miss: Compute hash for secondary table. |
| 144 __ Sub(scratch, scratch, Operand(name, LSR, kCacheIndexShift)); | 145 __ Sub(scratch, scratch, Operand(name)); |
| 145 __ Add(scratch, scratch, flags >> kCacheIndexShift); | 146 __ Add(scratch, scratch, Operand(flags)); |
| 146 __ And(scratch, scratch, kSecondaryTableSize - 1); | 147 __ Mov(extra, Operand(kSecondaryTableSize - 1)); |
| 148 __ And(scratch, scratch, Operand(extra, LSL, kCacheIndexShift)); | |
| 147 | 149 |
| 148 // Probe the secondary table. | 150 // Probe the secondary table. |
| 149 ProbeTable(this, masm, flags, kSecondary, receiver, name, scratch, extra, | 151 ProbeTable(this, masm, flags, kSecondary, receiver, name, scratch, extra, |
| 150 extra2, extra3); | 152 extra2, extra3); |
| 151 | 153 |
| 152 // Cache miss: Fall-through and let caller handle the miss by | 154 // Cache miss: Fall-through and let caller handle the miss by |
| 153 // entering the runtime system. | 155 // entering the runtime system. |
| 154 __ Bind(&miss); | 156 __ Bind(&miss); |
| 155 __ IncrementCounter(counters->megamorphic_stub_cache_misses(), 1, extra2, | 157 __ IncrementCounter(counters->megamorphic_stub_cache_misses(), 1, extra2, |
| 156 extra3); | 158 extra3); |
| 157 } | 159 } |
| 158 } // namespace internal | 160 } // namespace internal |
| 159 } // namespace v8 | 161 } // namespace v8 |
| 160 | 162 |
| 161 #endif // V8_TARGET_ARCH_ARM64 | 163 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |