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

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

Issue 1250563004: HydrogenCodeStubs consume stack arguments via descriptor. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Created 5 years, 5 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/handler-compiler.h ('k') | src/ic/ia32/handler-compiler-ia32.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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/cpu-profiler.h" 7 #include "src/cpu-profiler.h"
8 #include "src/ic/call-optimization.h" 8 #include "src/ic/call-optimization.h"
9 #include "src/ic/handler-compiler.h" 9 #include "src/ic/handler-compiler.h"
10 #include "src/ic/ic.h" 10 #include "src/ic/ic.h"
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 int descriptor = transition->LastAdded(); 458 int descriptor = transition->LastAdded();
459 Handle<DescriptorArray> descriptors(transition->instance_descriptors()); 459 Handle<DescriptorArray> descriptors(transition->instance_descriptors());
460 PropertyDetails details = descriptors->GetDetails(descriptor); 460 PropertyDetails details = descriptors->GetDetails(descriptor);
461 Representation representation = details.representation(); 461 Representation representation = details.representation();
462 DCHECK(!representation.IsNone()); 462 DCHECK(!representation.IsNone());
463 463
464 // Stub is never generated for objects that require access checks. 464 // Stub is never generated for objects that require access checks.
465 DCHECK(!transition->is_access_check_needed()); 465 DCHECK(!transition->is_access_check_needed());
466 466
467 // Call to respective StoreTransitionStub. 467 // Call to respective StoreTransitionStub.
468 Register transition_map_reg = StoreTransitionDescriptor::MapRegister();
469 bool push_map_on_stack = transition_map_reg.is(no_reg);
470 Register map_reg = push_map_on_stack ? scratch1() : transition_map_reg;
471
468 if (details.type() == DATA_CONSTANT) { 472 if (details.type() == DATA_CONSTANT) {
469 GenerateRestoreMap(transition, scratch2(), &miss);
470 DCHECK(descriptors->GetValue(descriptor)->IsJSFunction()); 473 DCHECK(descriptors->GetValue(descriptor)->IsJSFunction());
471 Register map_reg = StoreTransitionDescriptor::MapRegister(); 474 GenerateRestoreMap(transition, map_reg, scratch2(), &miss);
472 GenerateConstantCheck(map_reg, descriptor, value(), scratch2(), &miss); 475 GenerateConstantCheck(map_reg, descriptor, value(), scratch2(), &miss);
476 if (push_map_on_stack) {
477 GeneratePushMap(map_reg, scratch2());
478 }
473 GenerateRestoreName(name); 479 GenerateRestoreName(name);
474 StoreTransitionStub stub(isolate()); 480 StoreTransitionStub stub(isolate());
475 GenerateTailCall(masm(), stub.GetCode()); 481 GenerateTailCall(masm(), stub.GetCode());
476 482
477 } else { 483 } else {
478 if (representation.IsHeapObject()) { 484 if (representation.IsHeapObject()) {
479 GenerateFieldTypeChecks(descriptors->GetFieldType(descriptor), value(), 485 GenerateFieldTypeChecks(descriptors->GetFieldType(descriptor), value(),
480 &miss); 486 &miss);
481 } 487 }
482 StoreTransitionStub::StoreMode store_mode = 488 StoreTransitionStub::StoreMode store_mode =
483 Map::cast(transition->GetBackPointer())->unused_property_fields() == 0 489 Map::cast(transition->GetBackPointer())->unused_property_fields() == 0
484 ? StoreTransitionStub::ExtendStorageAndStoreMapAndValue 490 ? StoreTransitionStub::ExtendStorageAndStoreMapAndValue
485 : StoreTransitionStub::StoreMapAndValue; 491 : StoreTransitionStub::StoreMapAndValue;
486 492
487 GenerateRestoreMap(transition, scratch2(), &miss); 493 GenerateRestoreMap(transition, map_reg, scratch2(), &miss);
494 if (push_map_on_stack) {
495 GeneratePushMap(map_reg, scratch2());
496 }
488 GenerateRestoreName(name); 497 GenerateRestoreName(name);
489 StoreTransitionStub stub(isolate(), 498 StoreTransitionStub stub(isolate(),
490 FieldIndex::ForDescriptor(*transition, descriptor), 499 FieldIndex::ForDescriptor(*transition, descriptor),
491 representation, store_mode); 500 representation, store_mode);
492 GenerateTailCall(masm(), stub.GetCode()); 501 GenerateTailCall(masm(), stub.GetCode());
493 } 502 }
494 503
495 GenerateRestoreName(&miss, name); 504 GenerateRestoreName(&miss, name);
496 TailCallBuiltin(masm(), MissBuiltin(kind())); 505 TailCallBuiltin(masm(), MissBuiltin(kind()));
497 506
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 : kNoExtraICState); 588 : kNoExtraICState);
580 cached_stub = LoadDictionaryElementStub(isolate(), state).GetCode(); 589 cached_stub = LoadDictionaryElementStub(isolate(), state).GetCode();
581 } 590 }
582 } 591 }
583 592
584 handlers->Add(cached_stub); 593 handlers->Add(cached_stub);
585 } 594 }
586 } 595 }
587 } // namespace internal 596 } // namespace internal
588 } // namespace v8 597 } // namespace v8
OLDNEW
« no previous file with comments | « src/ic/handler-compiler.h ('k') | src/ic/ia32/handler-compiler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698