Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/ic/arm64/handler-compiler-arm64.cc

Issue 2623483002: [cleanup] Port KeyedLoadIC_{Slow,Miss} to TF and drop unused IC handler code (Closed)
Patch Set: rebased Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ic/arm/ic-arm.cc ('k') | src/ic/arm64/ic-arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #if V8_TARGET_ARCH_ARM64 5 #if V8_TARGET_ARCH_ARM64
6 6
7 #include "src/ic/handler-compiler.h" 7 #include "src/ic/handler-compiler.h"
8 8
9 #include "src/api-arguments.h" 9 #include "src/api-arguments.h"
10 #include "src/field-type.h" 10 #include "src/field-type.h"
(...skipping 26 matching lines...) Expand all
37 __ Pop(slot); 37 __ Pop(slot);
38 } 38 }
39 39
40 40
41 void PropertyHandlerCompiler::DiscardVectorAndSlot() { 41 void PropertyHandlerCompiler::DiscardVectorAndSlot() {
42 MacroAssembler* masm = this->masm(); 42 MacroAssembler* masm = this->masm();
43 // Remove vector and slot. 43 // Remove vector and slot.
44 __ Drop(2); 44 __ Drop(2);
45 } 45 }
46 46
47 void PropertyHandlerCompiler::PushReturnAddress(Register tmp) {
48 // No-op. Return address is in lr register.
49 }
50
51 void PropertyHandlerCompiler::PopReturnAddress(Register tmp) {
52 // No-op. Return address is in lr register.
53 }
54
55 void PropertyHandlerCompiler::GenerateDictionaryNegativeLookup( 47 void PropertyHandlerCompiler::GenerateDictionaryNegativeLookup(
56 MacroAssembler* masm, Label* miss_label, Register receiver, 48 MacroAssembler* masm, Label* miss_label, Register receiver,
57 Handle<Name> name, Register scratch0, Register scratch1) { 49 Handle<Name> name, Register scratch0, Register scratch1) {
58 DCHECK(!AreAliased(receiver, scratch0, scratch1)); 50 DCHECK(!AreAliased(receiver, scratch0, scratch1));
59 DCHECK(name->IsUniqueName()); 51 DCHECK(name->IsUniqueName());
60 Counters* counters = masm->isolate()->counters(); 52 Counters* counters = masm->isolate()->counters();
61 __ IncrementCounter(counters->negative_lookups(), 1, scratch0, scratch1); 53 __ IncrementCounter(counters->negative_lookups(), 1, scratch0, scratch1);
62 __ IncrementCounter(counters->negative_lookups_miss(), 1, scratch0, scratch1); 54 __ IncrementCounter(counters->negative_lookups_miss(), 1, scratch0, scratch1);
63 55
64 Label done; 56 Label done;
(...skipping 19 matching lines...) Expand all
84 // Check that the properties array is a dictionary. 76 // Check that the properties array is a dictionary.
85 __ Ldr(map, FieldMemOperand(properties, HeapObject::kMapOffset)); 77 __ Ldr(map, FieldMemOperand(properties, HeapObject::kMapOffset));
86 __ JumpIfNotRoot(map, Heap::kHashTableMapRootIndex, miss_label); 78 __ JumpIfNotRoot(map, Heap::kHashTableMapRootIndex, miss_label);
87 79
88 NameDictionaryLookupStub::GenerateNegativeLookup( 80 NameDictionaryLookupStub::GenerateNegativeLookup(
89 masm, miss_label, &done, receiver, properties, name, scratch1); 81 masm, miss_label, &done, receiver, properties, name, scratch1);
90 __ Bind(&done); 82 __ Bind(&done);
91 __ DecrementCounter(counters->negative_lookups_miss(), 1, scratch0, scratch1); 83 __ DecrementCounter(counters->negative_lookups_miss(), 1, scratch0, scratch1);
92 } 84 }
93 85
94
95 void NamedLoadHandlerCompiler::GenerateDirectLoadGlobalFunctionPrototype(
96 MacroAssembler* masm, int index, Register result, Label* miss) {
97 __ LoadNativeContextSlot(index, result);
98 // Load its initial map. The global functions all have initial maps.
99 __ Ldr(result,
100 FieldMemOperand(result, JSFunction::kPrototypeOrInitialMapOffset));
101 // Load the prototype from the initial map.
102 __ Ldr(result, FieldMemOperand(result, Map::kPrototypeOffset));
103 }
104
105
106 void NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype( 86 void NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(
107 MacroAssembler* masm, Register receiver, Register scratch1, 87 MacroAssembler* masm, Register receiver, Register scratch1,
108 Register scratch2, Label* miss_label) { 88 Register scratch2, Label* miss_label) {
109 __ TryGetFunctionPrototype(receiver, scratch1, scratch2, miss_label); 89 __ TryGetFunctionPrototype(receiver, scratch1, scratch2, miss_label);
110 // TryGetFunctionPrototype can't put the result directly in x0 because the 90 // TryGetFunctionPrototype can't put the result directly in x0 because the
111 // 3 inputs registers can't alias and we call this function from 91 // 3 inputs registers can't alias and we call this function from
112 // LoadIC::GenerateFunctionPrototype, where receiver is x0. So we explicitly 92 // LoadIC::GenerateFunctionPrototype, where receiver is x0. So we explicitly
113 // move the result in x0. 93 // move the result in x0.
114 __ Mov(x0, scratch1); 94 __ Mov(x0, scratch1);
115 __ Ret(); 95 __ Ret();
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 359
380 360
381 void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label, 361 void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label,
382 Handle<Name> name) { 362 Handle<Name> name) {
383 if (!label->is_unused()) { 363 if (!label->is_unused()) {
384 __ Bind(label); 364 __ Bind(label);
385 __ Mov(this->name(), Operand(name)); 365 __ Mov(this->name(), Operand(name));
386 } 366 }
387 } 367 }
388 368
389
390 void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
391 __ Mov(this->name(), Operand(name));
392 }
393
394
395 void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
396 Register map_reg,
397 Register scratch,
398 Label* miss) {
399 Handle<WeakCell> cell = Map::WeakCellForMap(transition);
400 DCHECK(!map_reg.is(scratch));
401 __ LoadWeakValue(map_reg, cell, miss);
402 if (transition->CanBeDeprecated()) {
403 __ Ldrsw(scratch, FieldMemOperand(map_reg, Map::kBitField3Offset));
404 __ TestAndBranchIfAnySet(scratch, Map::Deprecated::kMask, miss);
405 }
406 }
407
408
409 void NamedStoreHandlerCompiler::GenerateConstantCheck(Register map_reg,
410 int descriptor,
411 Register value_reg,
412 Register scratch,
413 Label* miss_label) {
414 DCHECK(!map_reg.is(scratch));
415 DCHECK(!map_reg.is(value_reg));
416 DCHECK(!value_reg.is(scratch));
417 __ LoadInstanceDescriptors(map_reg, scratch);
418 __ Ldr(scratch,
419 FieldMemOperand(scratch, DescriptorArray::GetValueOffset(descriptor)));
420 __ Cmp(value_reg, scratch);
421 __ B(ne, miss_label);
422 }
423
424 void NamedStoreHandlerCompiler::GenerateFieldTypeChecks(FieldType* field_type,
425 Register value_reg,
426 Label* miss_label) {
427 Register map_reg = scratch1();
428 Register scratch = scratch2();
429 DCHECK(!value_reg.is(map_reg));
430 DCHECK(!value_reg.is(scratch));
431 __ JumpIfSmi(value_reg, miss_label);
432 if (field_type->IsClass()) {
433 __ Ldr(map_reg, FieldMemOperand(value_reg, HeapObject::kMapOffset));
434 __ CmpWeakValue(map_reg, Map::WeakCellForMap(field_type->AsClass()),
435 scratch);
436 __ B(ne, miss_label);
437 }
438 }
439
440 void PropertyHandlerCompiler::GenerateAccessCheck( 369 void PropertyHandlerCompiler::GenerateAccessCheck(
441 Handle<WeakCell> native_context_cell, Register scratch1, Register scratch2, 370 Handle<WeakCell> native_context_cell, Register scratch1, Register scratch2,
442 Label* miss, bool compare_native_contexts_only) { 371 Label* miss, bool compare_native_contexts_only) {
443 Label done; 372 Label done;
444 // Load current native context. 373 // Load current native context.
445 __ Ldr(scratch1, NativeContextMemOperand()); 374 __ Ldr(scratch1, NativeContextMemOperand());
446 // Load expected native context. 375 // Load expected native context.
447 __ LoadWeakValue(scratch2, native_context_cell, miss); 376 __ LoadWeakValue(scratch2, native_context_cell, miss);
448 __ Cmp(scratch1, scratch2); 377 __ Cmp(scratch1, scratch2);
449 378
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 __ B(&success); 494 __ B(&success);
566 495
567 GenerateRestoreName(miss, name); 496 GenerateRestoreName(miss, name);
568 if (IC::ICUseVector(kind())) PopVectorAndSlot(); 497 if (IC::ICUseVector(kind())) PopVectorAndSlot();
569 TailCallBuiltin(masm(), MissBuiltin(kind())); 498 TailCallBuiltin(masm(), MissBuiltin(kind()));
570 499
571 __ Bind(&success); 500 __ Bind(&success);
572 } 501 }
573 } 502 }
574 503
575
576 void NamedLoadHandlerCompiler::GenerateLoadConstant(Handle<Object> value) {
577 // Return the constant value.
578 __ LoadObject(x0, value);
579 __ Ret();
580 }
581
582 void NamedLoadHandlerCompiler::GenerateLoadInterceptorWithFollowup( 504 void NamedLoadHandlerCompiler::GenerateLoadInterceptorWithFollowup(
583 LookupIterator* it, Register holder_reg) { 505 LookupIterator* it, Register holder_reg) {
584 DCHECK(!AreAliased(receiver(), this->name(), scratch1(), scratch2(), 506 DCHECK(!AreAliased(receiver(), this->name(), scratch1(), scratch2(),
585 scratch3())); 507 scratch3()));
586 DCHECK(holder()->HasNamedInterceptor()); 508 DCHECK(holder()->HasNamedInterceptor());
587 DCHECK(!holder()->GetNamedInterceptor()->getter()->IsUndefined(isolate())); 509 DCHECK(!holder()->GetNamedInterceptor()->getter()->IsUndefined(isolate()));
588 510
589 // Compile the interceptor call, followed by inline code to load the 511 // Compile the interceptor call, followed by inline code to load the
590 // property from further up the prototype chain if the call fails. 512 // property from further up the prototype chain if the call fails.
591 // Check that the maps haven't changed. 513 // Check that the maps haven't changed.
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 // Return the generated code. 606 // Return the generated code.
685 return GetCode(kind(), name); 607 return GetCode(kind(), name);
686 } 608 }
687 609
688 610
689 #undef __ 611 #undef __
690 } // namespace internal 612 } // namespace internal
691 } // namespace v8 613 } // namespace v8
692 614
693 #endif // V8_TARGET_ARCH_IA32 615 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ic/arm/ic-arm.cc ('k') | src/ic/arm64/ic-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698