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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 __ Cmp(key, scratch); | 324 __ Cmp(key, scratch); |
325 __ B(hs, slow_case); | 325 __ B(hs, slow_case); |
326 | 326 |
327 __ Add(backing_store, backing_store, | 327 __ Add(backing_store, backing_store, |
328 FixedArray::kHeaderSize - kHeapObjectTag); | 328 FixedArray::kHeaderSize - kHeapObjectTag); |
329 __ SmiUntag(scratch, key); | 329 __ SmiUntag(scratch, key); |
330 return MemOperand(backing_store, scratch, LSL, kPointerSizeLog2); | 330 return MemOperand(backing_store, scratch, LSL, kPointerSizeLog2); |
331 } | 331 } |
332 | 332 |
333 | 333 |
334 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { | |
335 // The return address is in lr. | |
336 Register receiver = LoadDescriptor::ReceiverRegister(); | |
337 Register name = LoadDescriptor::NameRegister(); | |
338 DCHECK(receiver.is(x1)); | |
339 DCHECK(name.is(x2)); | |
340 | |
341 // Probe the stub cache. | |
342 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | |
343 Code::ComputeHandlerFlags(Code::LOAD_IC)); | |
344 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, x3, | |
345 x4, x5, x6); | |
346 | |
347 // Cache miss: Jump to runtime. | |
348 GenerateMiss(masm); | |
349 } | |
350 | |
351 | |
352 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 334 void LoadIC::GenerateNormal(MacroAssembler* masm) { |
353 Register dictionary = x0; | 335 Register dictionary = x0; |
354 DCHECK(!dictionary.is(LoadDescriptor::ReceiverRegister())); | 336 DCHECK(!dictionary.is(LoadDescriptor::ReceiverRegister())); |
355 DCHECK(!dictionary.is(LoadDescriptor::NameRegister())); | 337 DCHECK(!dictionary.is(LoadDescriptor::NameRegister())); |
356 Label slow; | 338 Label slow; |
357 | 339 |
358 __ Ldr(dictionary, FieldMemOperand(LoadDescriptor::ReceiverRegister(), | 340 __ Ldr(dictionary, FieldMemOperand(LoadDescriptor::ReceiverRegister(), |
359 JSObject::kPropertiesOffset)); | 341 JSObject::kPropertiesOffset)); |
360 GenerateDictionaryLoad(masm, &slow, dictionary, | 342 GenerateDictionaryLoad(masm, &slow, dictionary, |
361 LoadDescriptor::NameRegister(), x0, x3, x4); | 343 LoadDescriptor::NameRegister(), x0, x3, x4); |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 | 969 |
988 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 970 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
989 Register receiver = StoreDescriptor::ReceiverRegister(); | 971 Register receiver = StoreDescriptor::ReceiverRegister(); |
990 Register name = StoreDescriptor::NameRegister(); | 972 Register name = StoreDescriptor::NameRegister(); |
991 DCHECK(!AreAliased(receiver, name, StoreDescriptor::ValueRegister(), x3, x4, | 973 DCHECK(!AreAliased(receiver, name, StoreDescriptor::ValueRegister(), x3, x4, |
992 x5, x6)); | 974 x5, x6)); |
993 | 975 |
994 // Probe the stub cache. | 976 // Probe the stub cache. |
995 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 977 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
996 Code::ComputeHandlerFlags(Code::STORE_IC)); | 978 Code::ComputeHandlerFlags(Code::STORE_IC)); |
997 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, x3, | 979 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, false, receiver, |
998 x4, x5, x6); | 980 name, x3, x4, x5, x6); |
999 | 981 |
1000 // Cache miss: Jump to runtime. | 982 // Cache miss: Jump to runtime. |
1001 GenerateMiss(masm); | 983 GenerateMiss(masm); |
1002 } | 984 } |
1003 | 985 |
1004 | 986 |
1005 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 987 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
1006 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | 988 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
1007 StoreDescriptor::ValueRegister()); | 989 StoreDescriptor::ValueRegister()); |
1008 | 990 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1117 } else { | 1099 } else { |
1118 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ); | 1100 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ); |
1119 // This is JumpIfSmi(smi_reg, branch_imm). | 1101 // This is JumpIfSmi(smi_reg, branch_imm). |
1120 patcher.tbz(smi_reg, 0, branch_imm); | 1102 patcher.tbz(smi_reg, 0, branch_imm); |
1121 } | 1103 } |
1122 } | 1104 } |
1123 } | 1105 } |
1124 } // namespace v8::internal | 1106 } // namespace v8::internal |
1125 | 1107 |
1126 #endif // V8_TARGET_ARCH_ARM64 | 1108 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |