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

Side by Side Diff: src/code-stubs.cc

Issue 2498073002: [refactoring] Split CodeAssemblerState out of CodeAssembler (Closed)
Patch Set: one more attempt Created 4 years, 1 month 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/code-stubs.h ('k') | src/code-stubs-hydrogen.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/code-stubs.h" 5 #include "src/code-stubs.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/ast/ast.h" 9 #include "src/ast/ast.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 if (state.CouldCreateAllocationMementos()) { 315 if (state.CouldCreateAllocationMementos()) {
316 BinaryOpICWithAllocationSiteStub stub(isolate, state); 316 BinaryOpICWithAllocationSiteStub stub(isolate, state);
317 stub.GetCode(); 317 stub.GetCode();
318 } 318 }
319 } 319 }
320 320
321 void StringAddStub::PrintBaseName(std::ostream& os) const { // NOLINT 321 void StringAddStub::PrintBaseName(std::ostream& os) const { // NOLINT
322 os << "StringAddStub_" << flags() << "_" << pretenure_flag(); 322 os << "StringAddStub_" << flags() << "_" << pretenure_flag();
323 } 323 }
324 324
325 void StringAddStub::GenerateAssembly(CodeStubAssembler* assembler) const { 325 void StringAddStub::GenerateAssembly(
326 compiler::CodeAssemblerState* state) const {
326 typedef compiler::Node Node; 327 typedef compiler::Node Node;
327 Node* left = assembler->Parameter(Descriptor::kLeft); 328 CodeStubAssembler assembler(state);
328 Node* right = assembler->Parameter(Descriptor::kRight); 329 Node* left = assembler.Parameter(Descriptor::kLeft);
329 Node* context = assembler->Parameter(Descriptor::kContext); 330 Node* right = assembler.Parameter(Descriptor::kRight);
331 Node* context = assembler.Parameter(Descriptor::kContext);
330 332
331 if ((flags() & STRING_ADD_CHECK_LEFT) != 0) { 333 if ((flags() & STRING_ADD_CHECK_LEFT) != 0) {
332 DCHECK((flags() & STRING_ADD_CONVERT) != 0); 334 DCHECK((flags() & STRING_ADD_CONVERT) != 0);
333 // TODO(danno): The ToString and JSReceiverToPrimitive below could be 335 // TODO(danno): The ToString and JSReceiverToPrimitive below could be
334 // combined to avoid duplicate smi and instance type checks. 336 // combined to avoid duplicate smi and instance type checks.
335 left = assembler->ToString(context, 337 left = assembler.ToString(context,
336 assembler->JSReceiverToPrimitive(context, left)); 338 assembler.JSReceiverToPrimitive(context, left));
337 } 339 }
338 if ((flags() & STRING_ADD_CHECK_RIGHT) != 0) { 340 if ((flags() & STRING_ADD_CHECK_RIGHT) != 0) {
339 DCHECK((flags() & STRING_ADD_CONVERT) != 0); 341 DCHECK((flags() & STRING_ADD_CONVERT) != 0);
340 // TODO(danno): The ToString and JSReceiverToPrimitive below could be 342 // TODO(danno): The ToString and JSReceiverToPrimitive below could be
341 // combined to avoid duplicate smi and instance type checks. 343 // combined to avoid duplicate smi and instance type checks.
342 right = assembler->ToString( 344 right = assembler.ToString(context,
343 context, assembler->JSReceiverToPrimitive(context, right)); 345 assembler.JSReceiverToPrimitive(context, right));
344 } 346 }
345 347
346 if ((flags() & STRING_ADD_CHECK_BOTH) == 0) { 348 if ((flags() & STRING_ADD_CHECK_BOTH) == 0) {
347 CodeStubAssembler::AllocationFlag flags = 349 CodeStubAssembler::AllocationFlag flags =
348 (pretenure_flag() == TENURED) ? CodeStubAssembler::kPretenured 350 (pretenure_flag() == TENURED) ? CodeStubAssembler::kPretenured
349 : CodeStubAssembler::kNone; 351 : CodeStubAssembler::kNone;
350 assembler->Return(assembler->StringAdd(context, left, right, flags)); 352 assembler.Return(assembler.StringAdd(context, left, right, flags));
351 } else { 353 } else {
352 Callable callable = CodeFactory::StringAdd(isolate(), STRING_ADD_CHECK_NONE, 354 Callable callable = CodeFactory::StringAdd(isolate(), STRING_ADD_CHECK_NONE,
353 pretenure_flag()); 355 pretenure_flag());
354 assembler->TailCallStub(callable, context, left, right); 356 assembler.TailCallStub(callable, context, left, right);
355 } 357 }
356 } 358 }
357 359
358 InlineCacheState CompareICStub::GetICState() const { 360 InlineCacheState CompareICStub::GetICState() const {
359 CompareICState::State state = Max(left(), right()); 361 CompareICState::State state = Max(left(), right());
360 switch (state) { 362 switch (state) {
361 case CompareICState::UNINITIALIZED: 363 case CompareICState::UNINITIALIZED:
362 return ::v8::internal::UNINITIALIZED; 364 return ::v8::internal::UNINITIALIZED;
363 case CompareICState::BOOLEAN: 365 case CompareICState::BOOLEAN:
364 case CompareICState::SMI: 366 case CompareICState::SMI:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 case CompareICState::GENERIC: 417 case CompareICState::GENERIC:
416 GenerateGeneric(masm); 418 GenerateGeneric(masm);
417 break; 419 break;
418 } 420 }
419 } 421 }
420 422
421 Handle<Code> TurboFanCodeStub::GenerateCode() { 423 Handle<Code> TurboFanCodeStub::GenerateCode() {
422 const char* name = CodeStub::MajorName(MajorKey()); 424 const char* name = CodeStub::MajorName(MajorKey());
423 Zone zone(isolate()->allocator(), ZONE_NAME); 425 Zone zone(isolate()->allocator(), ZONE_NAME);
424 CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor()); 426 CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor());
425 CodeStubAssembler assembler(isolate(), &zone, descriptor, GetCodeFlags(), 427 compiler::CodeAssemblerState state(isolate(), &zone, descriptor,
426 name); 428 GetCodeFlags(), name);
427 GenerateAssembly(&assembler); 429 GenerateAssembly(&state);
428 return assembler.GenerateCode(); 430 return compiler::CodeAssembler::GenerateCode(&state);
429 } 431 }
430 432
431 void LoadICTrampolineStub::GenerateAssembly( 433 void LoadICTrampolineStub::GenerateAssembly(
432 CodeStubAssembler* assembler) const { 434 compiler::CodeAssemblerState* state) const {
433 typedef compiler::Node Node; 435 typedef compiler::Node Node;
434 436 CodeStubAssembler assembler(state);
435 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 437
436 Node* name = assembler->Parameter(Descriptor::kName); 438 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
437 Node* slot = assembler->Parameter(Descriptor::kSlot); 439 Node* name = assembler.Parameter(Descriptor::kName);
438 Node* context = assembler->Parameter(Descriptor::kContext); 440 Node* slot = assembler.Parameter(Descriptor::kSlot);
439 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); 441 Node* context = assembler.Parameter(Descriptor::kContext);
440 442 Node* vector = assembler.LoadTypeFeedbackVectorForStub();
441 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); 443
442 assembler->LoadIC(&p); 444 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector);
443 } 445 assembler.LoadIC(&p);
444 446 }
445 void LoadICStub::GenerateAssembly(CodeStubAssembler* assembler) const { 447
446 typedef compiler::Node Node; 448 void LoadICStub::GenerateAssembly(compiler::CodeAssemblerState* state) const {
447 449 typedef compiler::Node Node;
448 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 450 CodeStubAssembler assembler(state);
449 Node* name = assembler->Parameter(Descriptor::kName); 451
450 Node* slot = assembler->Parameter(Descriptor::kSlot); 452 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
451 Node* vector = assembler->Parameter(Descriptor::kVector); 453 Node* name = assembler.Parameter(Descriptor::kName);
452 Node* context = assembler->Parameter(Descriptor::kContext); 454 Node* slot = assembler.Parameter(Descriptor::kSlot);
453 455 Node* vector = assembler.Parameter(Descriptor::kVector);
454 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); 456 Node* context = assembler.Parameter(Descriptor::kContext);
455 assembler->LoadIC(&p); 457
458 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector);
459 assembler.LoadIC(&p);
456 } 460 }
457 461
458 void LoadICProtoArrayStub::GenerateAssembly( 462 void LoadICProtoArrayStub::GenerateAssembly(
459 CodeStubAssembler* assembler) const { 463 compiler::CodeAssemblerState* state) const {
460 typedef compiler::Node Node; 464 typedef compiler::Node Node;
461 465 CodeStubAssembler assembler(state);
462 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 466
463 Node* name = assembler->Parameter(Descriptor::kName); 467 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
464 Node* slot = assembler->Parameter(Descriptor::kSlot); 468 Node* name = assembler.Parameter(Descriptor::kName);
465 Node* vector = assembler->Parameter(Descriptor::kVector); 469 Node* slot = assembler.Parameter(Descriptor::kSlot);
466 Node* handler = assembler->Parameter(Descriptor::kHandler); 470 Node* vector = assembler.Parameter(Descriptor::kVector);
467 Node* context = assembler->Parameter(Descriptor::kContext); 471 Node* handler = assembler.Parameter(Descriptor::kHandler);
468 472 Node* context = assembler.Parameter(Descriptor::kContext);
469 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); 473
470 assembler->LoadICProtoArray(&p, handler); 474 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector);
475 assembler.LoadICProtoArray(&p, handler);
471 } 476 }
472 477
473 void LoadGlobalICTrampolineStub::GenerateAssembly( 478 void LoadGlobalICTrampolineStub::GenerateAssembly(
474 CodeStubAssembler* assembler) const { 479 compiler::CodeAssemblerState* state) const {
475 typedef compiler::Node Node; 480 typedef compiler::Node Node;
476 481 CodeStubAssembler assembler(state);
477 Node* slot = assembler->Parameter(Descriptor::kSlot); 482
478 Node* context = assembler->Parameter(Descriptor::kContext); 483 Node* slot = assembler.Parameter(Descriptor::kSlot);
479 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); 484 Node* context = assembler.Parameter(Descriptor::kContext);
485 Node* vector = assembler.LoadTypeFeedbackVectorForStub();
480 486
481 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, 487 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot,
482 vector); 488 vector);
483 assembler->LoadGlobalIC(&p); 489 assembler.LoadGlobalIC(&p);
484 } 490 }
485 491
486 void LoadGlobalICStub::GenerateAssembly(CodeStubAssembler* assembler) const { 492 void LoadGlobalICStub::GenerateAssembly(
487 typedef compiler::Node Node; 493 compiler::CodeAssemblerState* state) const {
488 494 typedef compiler::Node Node;
489 Node* slot = assembler->Parameter(Descriptor::kSlot); 495 CodeStubAssembler assembler(state);
490 Node* vector = assembler->Parameter(Descriptor::kVector); 496
491 Node* context = assembler->Parameter(Descriptor::kContext); 497 Node* slot = assembler.Parameter(Descriptor::kSlot);
498 Node* vector = assembler.Parameter(Descriptor::kVector);
499 Node* context = assembler.Parameter(Descriptor::kContext);
492 500
493 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, 501 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot,
494 vector); 502 vector);
495 assembler->LoadGlobalIC(&p); 503 assembler.LoadGlobalIC(&p);
496 } 504 }
497 505
498 void KeyedLoadICTrampolineTFStub::GenerateAssembly( 506 void KeyedLoadICTrampolineTFStub::GenerateAssembly(
499 CodeStubAssembler* assembler) const { 507 compiler::CodeAssemblerState* state) const {
500 typedef compiler::Node Node; 508 typedef compiler::Node Node;
501 509 CodeStubAssembler assembler(state);
502 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 510
503 Node* name = assembler->Parameter(Descriptor::kName); 511 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
504 Node* slot = assembler->Parameter(Descriptor::kSlot); 512 Node* name = assembler.Parameter(Descriptor::kName);
505 Node* context = assembler->Parameter(Descriptor::kContext); 513 Node* slot = assembler.Parameter(Descriptor::kSlot);
506 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); 514 Node* context = assembler.Parameter(Descriptor::kContext);
507 515 Node* vector = assembler.LoadTypeFeedbackVectorForStub();
508 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); 516
509 assembler->KeyedLoadIC(&p); 517 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector);
510 } 518 assembler.KeyedLoadIC(&p);
511 519 }
512 void KeyedLoadICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { 520
513 typedef compiler::Node Node; 521 void KeyedLoadICTFStub::GenerateAssembly(
514 522 compiler::CodeAssemblerState* state) const {
515 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 523 typedef compiler::Node Node;
516 Node* name = assembler->Parameter(Descriptor::kName); 524 CodeStubAssembler assembler(state);
517 Node* slot = assembler->Parameter(Descriptor::kSlot); 525
518 Node* vector = assembler->Parameter(Descriptor::kVector); 526 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
519 Node* context = assembler->Parameter(Descriptor::kContext); 527 Node* name = assembler.Parameter(Descriptor::kName);
520 528 Node* slot = assembler.Parameter(Descriptor::kSlot);
521 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); 529 Node* vector = assembler.Parameter(Descriptor::kVector);
522 assembler->KeyedLoadIC(&p); 530 Node* context = assembler.Parameter(Descriptor::kContext);
531
532 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector);
533 assembler.KeyedLoadIC(&p);
523 } 534 }
524 535
525 void StoreICTrampolineStub::GenerateAssembly( 536 void StoreICTrampolineStub::GenerateAssembly(
526 CodeStubAssembler* assembler) const { 537 compiler::CodeAssemblerState* state) const {
527 typedef compiler::Node Node; 538 typedef compiler::Node Node;
528 539 CodeStubAssembler assembler(state);
529 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 540
530 Node* name = assembler->Parameter(Descriptor::kName); 541 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
531 Node* value = assembler->Parameter(Descriptor::kValue); 542 Node* name = assembler.Parameter(Descriptor::kName);
532 Node* slot = assembler->Parameter(Descriptor::kSlot); 543 Node* value = assembler.Parameter(Descriptor::kValue);
533 Node* context = assembler->Parameter(Descriptor::kContext); 544 Node* slot = assembler.Parameter(Descriptor::kSlot);
534 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); 545 Node* context = assembler.Parameter(Descriptor::kContext);
546 Node* vector = assembler.LoadTypeFeedbackVectorForStub();
535 547
536 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, 548 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot,
537 vector); 549 vector);
538 assembler->StoreIC(&p); 550 assembler.StoreIC(&p);
539 } 551 }
540 552
541 void StoreICStub::GenerateAssembly(CodeStubAssembler* assembler) const { 553 void StoreICStub::GenerateAssembly(compiler::CodeAssemblerState* state) const {
542 typedef compiler::Node Node; 554 typedef compiler::Node Node;
543 555 CodeStubAssembler assembler(state);
544 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 556
545 Node* name = assembler->Parameter(Descriptor::kName); 557 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
546 Node* value = assembler->Parameter(Descriptor::kValue); 558 Node* name = assembler.Parameter(Descriptor::kName);
547 Node* slot = assembler->Parameter(Descriptor::kSlot); 559 Node* value = assembler.Parameter(Descriptor::kValue);
548 Node* vector = assembler->Parameter(Descriptor::kVector); 560 Node* slot = assembler.Parameter(Descriptor::kSlot);
549 Node* context = assembler->Parameter(Descriptor::kContext); 561 Node* vector = assembler.Parameter(Descriptor::kVector);
562 Node* context = assembler.Parameter(Descriptor::kContext);
550 563
551 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, 564 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot,
552 vector); 565 vector);
553 assembler->StoreIC(&p); 566 assembler.StoreIC(&p);
554 } 567 }
555 568
556 void KeyedStoreICTrampolineTFStub::GenerateAssembly( 569 void KeyedStoreICTrampolineTFStub::GenerateAssembly(
557 CodeStubAssembler* assembler) const { 570 compiler::CodeAssemblerState* state) const {
558 typedef compiler::Node Node; 571 typedef compiler::Node Node;
559 572 CodeStubAssembler assembler(state);
560 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 573
561 Node* name = assembler->Parameter(Descriptor::kName); 574 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
562 Node* value = assembler->Parameter(Descriptor::kValue); 575 Node* name = assembler.Parameter(Descriptor::kName);
563 Node* slot = assembler->Parameter(Descriptor::kSlot); 576 Node* value = assembler.Parameter(Descriptor::kValue);
564 Node* context = assembler->Parameter(Descriptor::kContext); 577 Node* slot = assembler.Parameter(Descriptor::kSlot);
565 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); 578 Node* context = assembler.Parameter(Descriptor::kContext);
579 Node* vector = assembler.LoadTypeFeedbackVectorForStub();
566 580
567 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, 581 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot,
568 vector); 582 vector);
569 assembler->KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState())); 583 assembler.KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState()));
570 } 584 }
571 585
572 void KeyedStoreICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { 586 void KeyedStoreICTFStub::GenerateAssembly(
573 typedef compiler::Node Node; 587 compiler::CodeAssemblerState* state) const {
574 588 typedef compiler::Node Node;
575 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 589 CodeStubAssembler assembler(state);
576 Node* name = assembler->Parameter(Descriptor::kName); 590
577 Node* value = assembler->Parameter(Descriptor::kValue); 591 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
578 Node* slot = assembler->Parameter(Descriptor::kSlot); 592 Node* name = assembler.Parameter(Descriptor::kName);
579 Node* vector = assembler->Parameter(Descriptor::kVector); 593 Node* value = assembler.Parameter(Descriptor::kValue);
580 Node* context = assembler->Parameter(Descriptor::kContext); 594 Node* slot = assembler.Parameter(Descriptor::kSlot);
595 Node* vector = assembler.Parameter(Descriptor::kVector);
596 Node* context = assembler.Parameter(Descriptor::kContext);
581 597
582 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, 598 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot,
583 vector); 599 vector);
584 assembler->KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState())); 600 assembler.KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState()));
585 } 601 }
586 602
587 void StoreMapStub::GenerateAssembly(CodeStubAssembler* assembler) const { 603 void StoreMapStub::GenerateAssembly(compiler::CodeAssemblerState* state) const {
588 typedef compiler::Node Node; 604 typedef compiler::Node Node;
589 605 CodeStubAssembler assembler(state);
590 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 606
591 Node* map = assembler->Parameter(Descriptor::kMap); 607 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
592 Node* value = assembler->Parameter(Descriptor::kValue); 608 Node* map = assembler.Parameter(Descriptor::kMap);
593 609 Node* value = assembler.Parameter(Descriptor::kValue);
594 assembler->StoreObjectField(receiver, JSObject::kMapOffset, map); 610
595 assembler->Return(value); 611 assembler.StoreObjectField(receiver, JSObject::kMapOffset, map);
596 } 612 assembler.Return(value);
597 613 }
598 void StoreTransitionStub::GenerateAssembly(CodeStubAssembler* assembler) const { 614
615 void StoreTransitionStub::GenerateAssembly(
616 compiler::CodeAssemblerState* state) const {
599 typedef CodeStubAssembler::Label Label; 617 typedef CodeStubAssembler::Label Label;
600 typedef compiler::Node Node; 618 typedef compiler::Node Node;
601 619 CodeStubAssembler assembler(state);
602 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 620
603 Node* name = assembler->Parameter(Descriptor::kName); 621 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
622 Node* name = assembler.Parameter(Descriptor::kName);
604 Node* offset = 623 Node* offset =
605 assembler->SmiUntag(assembler->Parameter(Descriptor::kFieldOffset)); 624 assembler.SmiUntag(assembler.Parameter(Descriptor::kFieldOffset));
606 Node* value = assembler->Parameter(Descriptor::kValue); 625 Node* value = assembler.Parameter(Descriptor::kValue);
607 Node* map = assembler->Parameter(Descriptor::kMap); 626 Node* map = assembler.Parameter(Descriptor::kMap);
608 Node* slot = assembler->Parameter(Descriptor::kSlot); 627 Node* slot = assembler.Parameter(Descriptor::kSlot);
609 Node* vector = assembler->Parameter(Descriptor::kVector); 628 Node* vector = assembler.Parameter(Descriptor::kVector);
610 Node* context = assembler->Parameter(Descriptor::kContext); 629 Node* context = assembler.Parameter(Descriptor::kContext);
611 630
612 Label miss(assembler); 631 Label miss(&assembler);
613 632
614 Representation representation = this->representation(); 633 Representation representation = this->representation();
615 assembler->Comment("StoreTransitionStub: is_inobject: %d: representation: %s", 634 assembler.Comment("StoreTransitionStub: is_inobject: %d: representation: %s",
616 is_inobject(), representation.Mnemonic()); 635 is_inobject(), representation.Mnemonic());
617 636
618 Node* prepared_value = 637 Node* prepared_value =
619 assembler->PrepareValueForWrite(value, representation, &miss); 638 assembler.PrepareValueForWrite(value, representation, &miss);
620 639
621 if (store_mode() == StoreTransitionStub::ExtendStorageAndStoreMapAndValue) { 640 if (store_mode() == StoreTransitionStub::ExtendStorageAndStoreMapAndValue) {
622 assembler->Comment("Extend storage"); 641 assembler.Comment("Extend storage");
623 assembler->ExtendPropertiesBackingStore(receiver); 642 assembler.ExtendPropertiesBackingStore(receiver);
624 } else { 643 } else {
625 DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue); 644 DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue);
626 } 645 }
627 646
628 // Store the new value into the "extended" object. 647 // Store the new value into the "extended" object.
629 assembler->Comment("Store value"); 648 assembler.Comment("Store value");
630 assembler->StoreNamedField(receiver, offset, is_inobject(), representation, 649 assembler.StoreNamedField(receiver, offset, is_inobject(), representation,
631 prepared_value, true); 650 prepared_value, true);
632 651
633 // And finally update the map. 652 // And finally update the map.
634 assembler->Comment("Store map"); 653 assembler.Comment("Store map");
635 assembler->StoreObjectField(receiver, JSObject::kMapOffset, map); 654 assembler.StoreObjectField(receiver, JSObject::kMapOffset, map);
636 assembler->Return(value); 655 assembler.Return(value);
637 656
638 // Only store to tagged field never bails out. 657 // Only store to tagged field never bails out.
639 if (!representation.IsTagged()) { 658 if (!representation.IsTagged()) {
640 assembler->Bind(&miss); 659 assembler.Bind(&miss);
641 { 660 {
642 assembler->Comment("Miss"); 661 assembler.Comment("Miss");
643 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, 662 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
644 vector, receiver, name); 663 vector, receiver, name);
645 } 664 }
646 } 665 }
647 } 666 }
648 667
649 void ElementsTransitionAndStoreStub::GenerateAssembly( 668 void ElementsTransitionAndStoreStub::GenerateAssembly(
650 CodeStubAssembler* assembler) const { 669 compiler::CodeAssemblerState* state) const {
651 typedef CodeStubAssembler::Label Label; 670 typedef CodeStubAssembler::Label Label;
652 typedef compiler::Node Node; 671 typedef compiler::Node Node;
653 672 CodeStubAssembler assembler(state);
654 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 673
655 Node* key = assembler->Parameter(Descriptor::kName); 674 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
656 Node* value = assembler->Parameter(Descriptor::kValue); 675 Node* key = assembler.Parameter(Descriptor::kName);
657 Node* map = assembler->Parameter(Descriptor::kMap); 676 Node* value = assembler.Parameter(Descriptor::kValue);
658 Node* slot = assembler->Parameter(Descriptor::kSlot); 677 Node* map = assembler.Parameter(Descriptor::kMap);
659 Node* vector = assembler->Parameter(Descriptor::kVector); 678 Node* slot = assembler.Parameter(Descriptor::kSlot);
660 Node* context = assembler->Parameter(Descriptor::kContext); 679 Node* vector = assembler.Parameter(Descriptor::kVector);
661 680 Node* context = assembler.Parameter(Descriptor::kContext);
662 assembler->Comment( 681
682 assembler.Comment(
663 "ElementsTransitionAndStoreStub: from_kind=%s, to_kind=%s," 683 "ElementsTransitionAndStoreStub: from_kind=%s, to_kind=%s,"
664 " is_jsarray=%d, store_mode=%d", 684 " is_jsarray=%d, store_mode=%d",
665 ElementsKindToString(from_kind()), ElementsKindToString(to_kind()), 685 ElementsKindToString(from_kind()), ElementsKindToString(to_kind()),
666 is_jsarray(), store_mode()); 686 is_jsarray(), store_mode());
667 687
668 Label miss(assembler); 688 Label miss(&assembler);
669 689
670 if (FLAG_trace_elements_transitions) { 690 if (FLAG_trace_elements_transitions) {
671 // Tracing elements transitions is the job of the runtime. 691 // Tracing elements transitions is the job of the runtime.
672 assembler->Goto(&miss); 692 assembler.Goto(&miss);
673 } else { 693 } else {
674 assembler->TransitionElementsKind(receiver, map, from_kind(), to_kind(), 694 assembler.TransitionElementsKind(receiver, map, from_kind(), to_kind(),
675 is_jsarray(), &miss); 695 is_jsarray(), &miss);
676 assembler->EmitElementStore(receiver, key, value, is_jsarray(), to_kind(), 696 assembler.EmitElementStore(receiver, key, value, is_jsarray(), to_kind(),
677 store_mode(), &miss); 697 store_mode(), &miss);
678 assembler->Return(value); 698 assembler.Return(value);
679 } 699 }
680 700
681 assembler->Bind(&miss); 701 assembler.Bind(&miss);
682 { 702 {
683 assembler->Comment("Miss"); 703 assembler.Comment("Miss");
684 assembler->TailCallRuntime(Runtime::kElementsTransitionAndStoreIC_Miss, 704 assembler.TailCallRuntime(Runtime::kElementsTransitionAndStoreIC_Miss,
685 context, receiver, key, value, map, slot, 705 context, receiver, key, value, map, slot, vector);
686 vector);
687 } 706 }
688 } 707 }
689 708
690 void AllocateHeapNumberStub::GenerateAssembly( 709 void AllocateHeapNumberStub::GenerateAssembly(
691 CodeStubAssembler* assembler) const { 710 compiler::CodeAssemblerState* state) const {
692 typedef compiler::Node Node; 711 typedef compiler::Node Node;
693 712 CodeStubAssembler assembler(state);
694 Node* result = assembler->AllocateHeapNumber(); 713
695 assembler->Return(result); 714 Node* result = assembler.AllocateHeapNumber();
696 } 715 assembler.Return(result);
697 716 }
698 #define SIMD128_GEN_ASM(TYPE, Type, type, lane_count, lane_type) \ 717
699 void Allocate##Type##Stub::GenerateAssembly(CodeStubAssembler* assembler) \ 718 #define SIMD128_GEN_ASM(TYPE, Type, type, lane_count, lane_type) \
700 const { \ 719 void Allocate##Type##Stub::GenerateAssembly( \
701 compiler::Node* result = \ 720 compiler::CodeAssemblerState* state) const { \
702 assembler->Allocate(Simd128Value::kSize, CodeStubAssembler::kNone); \ 721 CodeStubAssembler assembler(state); \
703 compiler::Node* map = assembler->LoadMap(result); \ 722 compiler::Node* result = \
704 assembler->StoreNoWriteBarrier( \ 723 assembler.Allocate(Simd128Value::kSize, CodeStubAssembler::kNone); \
705 MachineRepresentation::kTagged, map, \ 724 compiler::Node* map = assembler.LoadMap(result); \
706 assembler->HeapConstant(isolate()->factory()->type##_map())); \ 725 assembler.StoreNoWriteBarrier( \
707 assembler->Return(result); \ 726 MachineRepresentation::kTagged, map, \
727 assembler.HeapConstant(isolate()->factory()->type##_map())); \
728 assembler.Return(result); \
708 } 729 }
709 SIMD128_TYPES(SIMD128_GEN_ASM) 730 SIMD128_TYPES(SIMD128_GEN_ASM)
710 #undef SIMD128_GEN_ASM 731 #undef SIMD128_GEN_ASM
711 732
712 void StringLengthStub::GenerateAssembly(CodeStubAssembler* assembler) const { 733 void StringLengthStub::GenerateAssembly(
713 compiler::Node* value = assembler->Parameter(0); 734 compiler::CodeAssemblerState* state) const {
714 compiler::Node* string = assembler->LoadJSValueValue(value); 735 CodeStubAssembler assembler(state);
715 compiler::Node* result = assembler->LoadStringLength(string); 736 compiler::Node* value = assembler.Parameter(0);
716 assembler->Return(result); 737 compiler::Node* string = assembler.LoadJSValueValue(value);
717 } 738 compiler::Node* result = assembler.LoadStringLength(string);
739 assembler.Return(result);
740 }
741
742 #define BINARY_OP_STUB(Name) \
743 void Name::GenerateAssembly(compiler::CodeAssemblerState* state) const { \
744 typedef BinaryOpWithVectorDescriptor Descriptor; \
745 CodeStubAssembler assembler(state); \
746 assembler.Return(Generate(&assembler, \
747 assembler.Parameter(Descriptor::kLeft), \
748 assembler.Parameter(Descriptor::kRight), \
749 assembler.Parameter(Descriptor::kSlot), \
750 assembler.Parameter(Descriptor::kVector), \
751 assembler.Parameter(Descriptor::kContext))); \
752 }
753 BINARY_OP_STUB(AddWithFeedbackStub)
754 BINARY_OP_STUB(SubtractWithFeedbackStub)
755 BINARY_OP_STUB(MultiplyWithFeedbackStub)
756 BINARY_OP_STUB(DivideWithFeedbackStub)
757 BINARY_OP_STUB(ModulusWithFeedbackStub)
758 #undef BINARY_OP_STUB
718 759
719 // static 760 // static
720 compiler::Node* AddWithFeedbackStub::Generate( 761 compiler::Node* AddWithFeedbackStub::Generate(
721 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* rhs, 762 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* rhs,
722 compiler::Node* slot_id, compiler::Node* type_feedback_vector, 763 compiler::Node* slot_id, compiler::Node* type_feedback_vector,
723 compiler::Node* context) { 764 compiler::Node* context) {
724 typedef CodeStubAssembler::Label Label; 765 typedef CodeStubAssembler::Label Label;
725 typedef compiler::Node Node; 766 typedef compiler::Node Node;
726 typedef CodeStubAssembler::Variable Variable; 767 typedef CodeStubAssembler::Variable Variable;
727 768
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after
1659 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor)); 1700 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor));
1660 assembler->Goto(&end); 1701 assembler->Goto(&end);
1661 } 1702 }
1662 1703
1663 assembler->Bind(&end); 1704 assembler->Bind(&end);
1664 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, 1705 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector,
1665 slot_id); 1706 slot_id);
1666 return var_result.value(); 1707 return var_result.value();
1667 } 1708 }
1668 1709
1710 #define UNARY_OP_STUB(Name) \
1711 void Name::GenerateAssembly(compiler::CodeAssemblerState* state) const { \
1712 CodeStubAssembler assembler(state); \
1713 assembler.Return(Generate(&assembler, assembler.Parameter(0), \
1714 assembler.Parameter(1), assembler.Parameter(2), \
1715 assembler.Parameter(3))); \
1716 }
1717 UNARY_OP_STUB(IncStub)
1718 UNARY_OP_STUB(DecStub)
1719 #undef UNARY_OP_STUB
1720
1669 // static 1721 // static
1670 compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, 1722 compiler::Node* IncStub::Generate(CodeStubAssembler* assembler,
1671 compiler::Node* value, 1723 compiler::Node* value,
1672 compiler::Node* context, 1724 compiler::Node* context,
1673 compiler::Node* type_feedback_vector, 1725 compiler::Node* type_feedback_vector,
1674 compiler::Node* slot_id) { 1726 compiler::Node* slot_id) {
1675 typedef CodeStubAssembler::Label Label; 1727 typedef CodeStubAssembler::Label Label;
1676 typedef compiler::Node Node; 1728 typedef compiler::Node Node;
1677 typedef CodeStubAssembler::Variable Variable; 1729 typedef CodeStubAssembler::Variable Variable;
1678 1730
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1792 result_var.Bind(assembler->AllocateHeapNumberWithValue(finc_result)); 1844 result_var.Bind(assembler->AllocateHeapNumberWithValue(finc_result));
1793 assembler->Goto(&end); 1845 assembler->Goto(&end);
1794 } 1846 }
1795 1847
1796 assembler->Bind(&end); 1848 assembler->Bind(&end);
1797 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, 1849 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector,
1798 slot_id); 1850 slot_id);
1799 return result_var.value(); 1851 return result_var.value();
1800 } 1852 }
1801 1853
1802 void NumberToStringStub::GenerateAssembly(CodeStubAssembler* assembler) const { 1854 void NumberToStringStub::GenerateAssembly(
1855 compiler::CodeAssemblerState* state) const {
1803 typedef compiler::Node Node; 1856 typedef compiler::Node Node;
1804 Node* argument = assembler->Parameter(Descriptor::kArgument); 1857 CodeStubAssembler assembler(state);
1805 Node* context = assembler->Parameter(Descriptor::kContext); 1858 Node* argument = assembler.Parameter(Descriptor::kArgument);
1806 assembler->Return(assembler->NumberToString(context, argument)); 1859 Node* context = assembler.Parameter(Descriptor::kContext);
1860 assembler.Return(assembler.NumberToString(context, argument));
1807 } 1861 }
1808 1862
1809 // static 1863 // static
1810 compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, 1864 compiler::Node* DecStub::Generate(CodeStubAssembler* assembler,
1811 compiler::Node* value, 1865 compiler::Node* value,
1812 compiler::Node* context, 1866 compiler::Node* context,
1813 compiler::Node* type_feedback_vector, 1867 compiler::Node* type_feedback_vector,
1814 compiler::Node* slot_id) { 1868 compiler::Node* slot_id) {
1815 typedef CodeStubAssembler::Label Label; 1869 typedef CodeStubAssembler::Label Label;
1816 typedef compiler::Node Node; 1870 typedef compiler::Node Node;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1941 1995
1942 // ES6 section 21.1.3.19 String.prototype.substring ( start, end ) 1996 // ES6 section 21.1.3.19 String.prototype.substring ( start, end )
1943 compiler::Node* SubStringStub::Generate(CodeStubAssembler* assembler, 1997 compiler::Node* SubStringStub::Generate(CodeStubAssembler* assembler,
1944 compiler::Node* string, 1998 compiler::Node* string,
1945 compiler::Node* from, 1999 compiler::Node* from,
1946 compiler::Node* to, 2000 compiler::Node* to,
1947 compiler::Node* context) { 2001 compiler::Node* context) {
1948 return assembler->SubString(context, string, from, to); 2002 return assembler->SubString(context, string, from, to);
1949 } 2003 }
1950 2004
1951 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { 2005 void SubStringStub::GenerateAssembly(
2006 compiler::CodeAssemblerState* state) const {
2007 CodeStubAssembler assembler(state);
2008 assembler.Return(Generate(&assembler,
2009 assembler.Parameter(Descriptor::kString),
2010 assembler.Parameter(Descriptor::kFrom),
2011 assembler.Parameter(Descriptor::kTo),
2012 assembler.Parameter(Descriptor::kContext)));
2013 }
2014
2015 void LoadApiGetterStub::GenerateAssembly(
2016 compiler::CodeAssemblerState* state) const {
1952 typedef compiler::Node Node; 2017 typedef compiler::Node Node;
1953 Node* context = assembler->Parameter(Descriptor::kContext); 2018 CodeStubAssembler assembler(state);
1954 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 2019 Node* context = assembler.Parameter(Descriptor::kContext);
2020 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
1955 // For now we only support receiver_is_holder. 2021 // For now we only support receiver_is_holder.
1956 DCHECK(receiver_is_holder()); 2022 DCHECK(receiver_is_holder());
1957 Node* holder = receiver; 2023 Node* holder = receiver;
1958 Node* map = assembler->LoadMap(receiver); 2024 Node* map = assembler.LoadMap(receiver);
1959 Node* descriptors = assembler->LoadMapDescriptors(map); 2025 Node* descriptors = assembler.LoadMapDescriptors(map);
1960 Node* value_index = 2026 Node* value_index =
1961 assembler->IntPtrConstant(DescriptorArray::ToValueIndex(index())); 2027 assembler.IntPtrConstant(DescriptorArray::ToValueIndex(index()));
1962 Node* callback = assembler->LoadFixedArrayElement( 2028 Node* callback = assembler.LoadFixedArrayElement(
1963 descriptors, value_index, 0, CodeStubAssembler::INTPTR_PARAMETERS); 2029 descriptors, value_index, 0, CodeStubAssembler::INTPTR_PARAMETERS);
1964 assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, 2030 assembler.TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver,
1965 holder, callback); 2031 holder, callback);
1966 } 2032 }
1967 2033
1968 void StoreFieldStub::GenerateAssembly(CodeStubAssembler* assembler) const { 2034 void StoreFieldStub::GenerateAssembly(
2035 compiler::CodeAssemblerState* state) const {
1969 typedef CodeStubAssembler::Label Label; 2036 typedef CodeStubAssembler::Label Label;
1970 typedef compiler::Node Node; 2037 typedef compiler::Node Node;
2038 CodeStubAssembler assembler(state);
1971 2039
1972 FieldIndex index = this->index(); 2040 FieldIndex index = this->index();
1973 Representation representation = this->representation(); 2041 Representation representation = this->representation();
1974 2042
1975 assembler->Comment("StoreFieldStub: inobject=%d, offset=%d, rep=%s", 2043 assembler.Comment("StoreFieldStub: inobject=%d, offset=%d, rep=%s",
1976 index.is_inobject(), index.offset(), 2044 index.is_inobject(), index.offset(),
1977 representation.Mnemonic()); 2045 representation.Mnemonic());
1978 2046
1979 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 2047 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
1980 Node* name = assembler->Parameter(Descriptor::kName); 2048 Node* name = assembler.Parameter(Descriptor::kName);
1981 Node* value = assembler->Parameter(Descriptor::kValue); 2049 Node* value = assembler.Parameter(Descriptor::kValue);
1982 Node* slot = assembler->Parameter(Descriptor::kSlot); 2050 Node* slot = assembler.Parameter(Descriptor::kSlot);
1983 Node* vector = assembler->Parameter(Descriptor::kVector); 2051 Node* vector = assembler.Parameter(Descriptor::kVector);
1984 Node* context = assembler->Parameter(Descriptor::kContext); 2052 Node* context = assembler.Parameter(Descriptor::kContext);
1985 2053
1986 Label miss(assembler); 2054 Label miss(&assembler);
1987 2055
1988 Node* prepared_value = 2056 Node* prepared_value =
1989 assembler->PrepareValueForWrite(value, representation, &miss); 2057 assembler.PrepareValueForWrite(value, representation, &miss);
1990 assembler->StoreNamedField(receiver, index, representation, prepared_value, 2058 assembler.StoreNamedField(receiver, index, representation, prepared_value,
1991 false); 2059 false);
1992 assembler->Return(value); 2060 assembler.Return(value);
1993 2061
1994 // Only stores to tagged field can't bailout. 2062 // Only stores to tagged field can't bailout.
1995 if (!representation.IsTagged()) { 2063 if (!representation.IsTagged()) {
1996 assembler->Bind(&miss); 2064 assembler.Bind(&miss);
1997 { 2065 {
1998 assembler->Comment("Miss"); 2066 assembler.Comment("Miss");
1999 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, 2067 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
2000 vector, receiver, name); 2068 vector, receiver, name);
2001 } 2069 }
2002 } 2070 }
2003 } 2071 }
2004 2072
2005 void StoreGlobalStub::GenerateAssembly(CodeStubAssembler* assembler) const { 2073 void StoreGlobalStub::GenerateAssembly(
2074 compiler::CodeAssemblerState* state) const {
2006 typedef CodeStubAssembler::Label Label; 2075 typedef CodeStubAssembler::Label Label;
2007 typedef compiler::Node Node; 2076 typedef compiler::Node Node;
2077 CodeStubAssembler assembler(state);
2008 2078
2009 assembler->Comment( 2079 assembler.Comment(
2010 "StoreGlobalStub: cell_type=%d, constant_type=%d, check_global=%d", 2080 "StoreGlobalStub: cell_type=%d, constant_type=%d, check_global=%d",
2011 cell_type(), PropertyCellType::kConstantType == cell_type() 2081 cell_type(), PropertyCellType::kConstantType == cell_type()
2012 ? static_cast<int>(constant_type()) 2082 ? static_cast<int>(constant_type())
2013 : -1, 2083 : -1,
2014 check_global()); 2084 check_global());
2015 2085
2016 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 2086 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
2017 Node* name = assembler->Parameter(Descriptor::kName); 2087 Node* name = assembler.Parameter(Descriptor::kName);
2018 Node* value = assembler->Parameter(Descriptor::kValue); 2088 Node* value = assembler.Parameter(Descriptor::kValue);
2019 Node* slot = assembler->Parameter(Descriptor::kSlot); 2089 Node* slot = assembler.Parameter(Descriptor::kSlot);
2020 Node* vector = assembler->Parameter(Descriptor::kVector); 2090 Node* vector = assembler.Parameter(Descriptor::kVector);
2021 Node* context = assembler->Parameter(Descriptor::kContext); 2091 Node* context = assembler.Parameter(Descriptor::kContext);
2022 2092
2023 Label miss(assembler); 2093 Label miss(&assembler);
2024 2094
2025 if (check_global()) { 2095 if (check_global()) {
2026 // Check that the map of the global has not changed: use a placeholder map 2096 // Check that the map of the global has not changed: use a placeholder map
2027 // that will be replaced later with the global object's map. 2097 // that will be replaced later with the global object's map.
2028 Node* proxy_map = assembler->LoadMap(receiver); 2098 Node* proxy_map = assembler.LoadMap(receiver);
2029 Node* global = assembler->LoadObjectField(proxy_map, Map::kPrototypeOffset); 2099 Node* global = assembler.LoadObjectField(proxy_map, Map::kPrototypeOffset);
2030 Node* map_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell( 2100 Node* map_cell = assembler.HeapConstant(isolate()->factory()->NewWeakCell(
2031 StoreGlobalStub::global_map_placeholder(isolate()))); 2101 StoreGlobalStub::global_map_placeholder(isolate())));
2032 Node* expected_map = assembler->LoadWeakCellValueUnchecked(map_cell); 2102 Node* expected_map = assembler.LoadWeakCellValueUnchecked(map_cell);
2033 Node* map = assembler->LoadMap(global); 2103 Node* map = assembler.LoadMap(global);
2034 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss); 2104 assembler.GotoIf(assembler.WordNotEqual(expected_map, map), &miss);
2035 } 2105 }
2036 2106
2037 Node* weak_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell( 2107 Node* weak_cell = assembler.HeapConstant(isolate()->factory()->NewWeakCell(
2038 StoreGlobalStub::property_cell_placeholder(isolate()))); 2108 StoreGlobalStub::property_cell_placeholder(isolate())));
2039 Node* cell = assembler->LoadWeakCellValue(weak_cell); 2109 Node* cell = assembler.LoadWeakCellValue(weak_cell);
2040 assembler->GotoIf(assembler->TaggedIsSmi(cell), &miss); 2110 assembler.GotoIf(assembler.TaggedIsSmi(cell), &miss);
2041 2111
2042 // Load the payload of the global parameter cell. A hole indicates that the 2112 // Load the payload of the global parameter cell. A hole indicates that the
2043 // cell has been invalidated and that the store must be handled by the 2113 // cell has been invalidated and that the store must be handled by the
2044 // runtime. 2114 // runtime.
2045 Node* cell_contents = 2115 Node* cell_contents =
2046 assembler->LoadObjectField(cell, PropertyCell::kValueOffset); 2116 assembler.LoadObjectField(cell, PropertyCell::kValueOffset);
2047 2117
2048 PropertyCellType cell_type = this->cell_type(); 2118 PropertyCellType cell_type = this->cell_type();
2049 if (cell_type == PropertyCellType::kConstant || 2119 if (cell_type == PropertyCellType::kConstant ||
2050 cell_type == PropertyCellType::kUndefined) { 2120 cell_type == PropertyCellType::kUndefined) {
2051 // This is always valid for all states a cell can be in. 2121 // This is always valid for all states a cell can be in.
2052 assembler->GotoIf(assembler->WordNotEqual(cell_contents, value), &miss); 2122 assembler.GotoIf(assembler.WordNotEqual(cell_contents, value), &miss);
2053 } else { 2123 } else {
2054 assembler->GotoIf(assembler->IsTheHole(cell_contents), &miss); 2124 assembler.GotoIf(assembler.IsTheHole(cell_contents), &miss);
2055 2125
2056 // When dealing with constant types, the type may be allowed to change, as 2126 // When dealing with constant types, the type may be allowed to change, as
2057 // long as optimized code remains valid. 2127 // long as optimized code remains valid.
2058 bool value_is_smi = false; 2128 bool value_is_smi = false;
2059 if (cell_type == PropertyCellType::kConstantType) { 2129 if (cell_type == PropertyCellType::kConstantType) {
2060 switch (constant_type()) { 2130 switch (constant_type()) {
2061 case PropertyCellConstantType::kSmi: 2131 case PropertyCellConstantType::kSmi:
2062 assembler->GotoUnless(assembler->TaggedIsSmi(value), &miss); 2132 assembler.GotoUnless(assembler.TaggedIsSmi(value), &miss);
2063 value_is_smi = true; 2133 value_is_smi = true;
2064 break; 2134 break;
2065 case PropertyCellConstantType::kStableMap: { 2135 case PropertyCellConstantType::kStableMap: {
2066 // It is sufficient here to check that the value and cell contents 2136 // It is sufficient here to check that the value and cell contents
2067 // have identical maps, no matter if they are stable or not or if they 2137 // have identical maps, no matter if they are stable or not or if they
2068 // are the maps that were originally in the cell or not. If optimized 2138 // are the maps that were originally in the cell or not. If optimized
2069 // code will deopt when a cell has a unstable map and if it has a 2139 // code will deopt when a cell has a unstable map and if it has a
2070 // dependency on a stable map, it will deopt if the map destabilizes. 2140 // dependency on a stable map, it will deopt if the map destabilizes.
2071 assembler->GotoIf(assembler->TaggedIsSmi(value), &miss); 2141 assembler.GotoIf(assembler.TaggedIsSmi(value), &miss);
2072 assembler->GotoIf(assembler->TaggedIsSmi(cell_contents), &miss); 2142 assembler.GotoIf(assembler.TaggedIsSmi(cell_contents), &miss);
2073 Node* expected_map = assembler->LoadMap(cell_contents); 2143 Node* expected_map = assembler.LoadMap(cell_contents);
2074 Node* map = assembler->LoadMap(value); 2144 Node* map = assembler.LoadMap(value);
2075 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss); 2145 assembler.GotoIf(assembler.WordNotEqual(expected_map, map), &miss);
2076 break; 2146 break;
2077 } 2147 }
2078 } 2148 }
2079 } 2149 }
2080 if (value_is_smi) { 2150 if (value_is_smi) {
2081 assembler->StoreObjectFieldNoWriteBarrier( 2151 assembler.StoreObjectFieldNoWriteBarrier(cell, PropertyCell::kValueOffset,
2082 cell, PropertyCell::kValueOffset, value); 2152 value);
2083 } else { 2153 } else {
2084 assembler->StoreObjectField(cell, PropertyCell::kValueOffset, value); 2154 assembler.StoreObjectField(cell, PropertyCell::kValueOffset, value);
2085 } 2155 }
2086 } 2156 }
2087 2157
2088 assembler->Return(value); 2158 assembler.Return(value);
2089 2159
2090 assembler->Bind(&miss); 2160 assembler.Bind(&miss);
2091 { 2161 {
2092 assembler->Comment("Miss"); 2162 assembler.Comment("Miss");
2093 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, 2163 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
2094 vector, receiver, name); 2164 vector, receiver, name);
2095 } 2165 }
2096 } 2166 }
2097 2167
2098 void KeyedLoadSloppyArgumentsStub::GenerateAssembly( 2168 void KeyedLoadSloppyArgumentsStub::GenerateAssembly(
2099 CodeStubAssembler* assembler) const { 2169 compiler::CodeAssemblerState* state) const {
2100 typedef CodeStubAssembler::Label Label; 2170 typedef CodeStubAssembler::Label Label;
2101 typedef compiler::Node Node; 2171 typedef compiler::Node Node;
2172 CodeStubAssembler assembler(state);
2102 2173
2103 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 2174 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
2104 Node* key = assembler->Parameter(Descriptor::kName); 2175 Node* key = assembler.Parameter(Descriptor::kName);
2105 Node* slot = assembler->Parameter(Descriptor::kSlot); 2176 Node* slot = assembler.Parameter(Descriptor::kSlot);
2106 Node* vector = assembler->Parameter(Descriptor::kVector); 2177 Node* vector = assembler.Parameter(Descriptor::kVector);
2107 Node* context = assembler->Parameter(Descriptor::kContext); 2178 Node* context = assembler.Parameter(Descriptor::kContext);
2108 2179
2109 Label miss(assembler); 2180 Label miss(&assembler);
2110 2181
2111 Node* result = assembler->LoadKeyedSloppyArguments(receiver, key, &miss); 2182 Node* result = assembler.LoadKeyedSloppyArguments(receiver, key, &miss);
2112 assembler->Return(result); 2183 assembler.Return(result);
2113 2184
2114 assembler->Bind(&miss); 2185 assembler.Bind(&miss);
2115 { 2186 {
2116 assembler->Comment("Miss"); 2187 assembler.Comment("Miss");
2117 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, 2188 assembler.TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver,
2118 key, slot, vector); 2189 key, slot, vector);
2119 } 2190 }
2120 } 2191 }
2121 2192
2122 void KeyedStoreSloppyArgumentsStub::GenerateAssembly( 2193 void KeyedStoreSloppyArgumentsStub::GenerateAssembly(
2123 CodeStubAssembler* assembler) const { 2194 compiler::CodeAssemblerState* state) const {
2124 typedef CodeStubAssembler::Label Label; 2195 typedef CodeStubAssembler::Label Label;
2125 typedef compiler::Node Node; 2196 typedef compiler::Node Node;
2197 CodeStubAssembler assembler(state);
2126 2198
2127 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 2199 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
2128 Node* key = assembler->Parameter(Descriptor::kName); 2200 Node* key = assembler.Parameter(Descriptor::kName);
2129 Node* value = assembler->Parameter(Descriptor::kValue); 2201 Node* value = assembler.Parameter(Descriptor::kValue);
2130 Node* slot = assembler->Parameter(Descriptor::kSlot); 2202 Node* slot = assembler.Parameter(Descriptor::kSlot);
2131 Node* vector = assembler->Parameter(Descriptor::kVector); 2203 Node* vector = assembler.Parameter(Descriptor::kVector);
2132 Node* context = assembler->Parameter(Descriptor::kContext); 2204 Node* context = assembler.Parameter(Descriptor::kContext);
2133 2205
2134 Label miss(assembler); 2206 Label miss(&assembler);
2135 2207
2136 assembler->StoreKeyedSloppyArguments(receiver, key, value, &miss); 2208 assembler.StoreKeyedSloppyArguments(receiver, key, value, &miss);
2137 assembler->Return(value); 2209 assembler.Return(value);
2138 2210
2139 assembler->Bind(&miss); 2211 assembler.Bind(&miss);
2140 { 2212 {
2141 assembler->Comment("Miss"); 2213 assembler.Comment("Miss");
2142 assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, 2214 assembler.TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, slot,
2143 slot, vector, receiver, key); 2215 vector, receiver, key);
2144 } 2216 }
2145 } 2217 }
2146 2218
2147 void LoadScriptContextFieldStub::GenerateAssembly( 2219 void LoadScriptContextFieldStub::GenerateAssembly(
2148 CodeStubAssembler* assembler) const { 2220 compiler::CodeAssemblerState* state) const {
2149 typedef compiler::Node Node; 2221 typedef compiler::Node Node;
2222 CodeStubAssembler assembler(state);
2150 2223
2151 assembler->Comment("LoadScriptContextFieldStub: context_index=%d, slot=%d", 2224 assembler.Comment("LoadScriptContextFieldStub: context_index=%d, slot=%d",
2152 context_index(), slot_index()); 2225 context_index(), slot_index());
2153 2226
2154 Node* context = assembler->Parameter(Descriptor::kContext); 2227 Node* context = assembler.Parameter(Descriptor::kContext);
2155 2228
2156 Node* script_context = assembler->LoadScriptContext(context, context_index()); 2229 Node* script_context = assembler.LoadScriptContext(context, context_index());
2157 Node* result = assembler->LoadFixedArrayElement( 2230 Node* result = assembler.LoadFixedArrayElement(
2158 script_context, assembler->IntPtrConstant(slot_index()), 0, 2231 script_context, assembler.IntPtrConstant(slot_index()), 0,
2159 CodeStubAssembler::INTPTR_PARAMETERS); 2232 CodeStubAssembler::INTPTR_PARAMETERS);
2160 assembler->Return(result); 2233 assembler.Return(result);
2161 } 2234 }
2162 2235
2163 void StoreScriptContextFieldStub::GenerateAssembly( 2236 void StoreScriptContextFieldStub::GenerateAssembly(
2164 CodeStubAssembler* assembler) const { 2237 compiler::CodeAssemblerState* state) const {
2165 typedef compiler::Node Node; 2238 typedef compiler::Node Node;
2239 CodeStubAssembler assembler(state);
2166 2240
2167 assembler->Comment("StoreScriptContextFieldStub: context_index=%d, slot=%d", 2241 assembler.Comment("StoreScriptContextFieldStub: context_index=%d, slot=%d",
2168 context_index(), slot_index()); 2242 context_index(), slot_index());
2169 2243
2170 Node* value = assembler->Parameter(Descriptor::kValue); 2244 Node* value = assembler.Parameter(Descriptor::kValue);
2171 Node* context = assembler->Parameter(Descriptor::kContext); 2245 Node* context = assembler.Parameter(Descriptor::kContext);
2172 2246
2173 Node* script_context = assembler->LoadScriptContext(context, context_index()); 2247 Node* script_context = assembler.LoadScriptContext(context, context_index());
2174 assembler->StoreFixedArrayElement( 2248 assembler.StoreFixedArrayElement(
2175 script_context, assembler->IntPtrConstant(slot_index()), value, 2249 script_context, assembler.IntPtrConstant(slot_index()), value,
2176 UPDATE_WRITE_BARRIER, CodeStubAssembler::INTPTR_PARAMETERS); 2250 UPDATE_WRITE_BARRIER, CodeStubAssembler::INTPTR_PARAMETERS);
2177 assembler->Return(value); 2251 assembler.Return(value);
2178 } 2252 }
2179 2253
2180 void StoreInterceptorStub::GenerateAssembly( 2254 void StoreInterceptorStub::GenerateAssembly(
2181 CodeStubAssembler* assembler) const { 2255 compiler::CodeAssemblerState* state) const {
2182 typedef compiler::Node Node; 2256 typedef compiler::Node Node;
2257 CodeStubAssembler assembler(state);
2183 2258
2184 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 2259 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
2185 Node* name = assembler->Parameter(Descriptor::kName); 2260 Node* name = assembler.Parameter(Descriptor::kName);
2186 Node* value = assembler->Parameter(Descriptor::kValue); 2261 Node* value = assembler.Parameter(Descriptor::kValue);
2187 Node* context = assembler->Parameter(Descriptor::kContext); 2262 Node* context = assembler.Parameter(Descriptor::kContext);
2188 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, 2263 assembler.TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context,
2189 receiver, name, value); 2264 receiver, name, value);
2190 } 2265 }
2191 2266
2192 void LoadIndexedInterceptorStub::GenerateAssembly( 2267 void LoadIndexedInterceptorStub::GenerateAssembly(
2193 CodeStubAssembler* assembler) const { 2268 compiler::CodeAssemblerState* state) const {
2194 typedef compiler::Node Node; 2269 typedef compiler::Node Node;
2195 typedef CodeStubAssembler::Label Label; 2270 typedef CodeStubAssembler::Label Label;
2271 CodeStubAssembler assembler(state);
2196 2272
2197 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 2273 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
2198 Node* key = assembler->Parameter(Descriptor::kName); 2274 Node* key = assembler.Parameter(Descriptor::kName);
2199 Node* slot = assembler->Parameter(Descriptor::kSlot); 2275 Node* slot = assembler.Parameter(Descriptor::kSlot);
2200 Node* vector = assembler->Parameter(Descriptor::kVector); 2276 Node* vector = assembler.Parameter(Descriptor::kVector);
2201 Node* context = assembler->Parameter(Descriptor::kContext); 2277 Node* context = assembler.Parameter(Descriptor::kContext);
2202 2278
2203 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); 2279 Label if_keyispositivesmi(&assembler), if_keyisinvalid(&assembler);
2204 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, 2280 assembler.Branch(assembler.WordIsPositiveSmi(key), &if_keyispositivesmi,
2205 &if_keyisinvalid); 2281 &if_keyisinvalid);
2206 assembler->Bind(&if_keyispositivesmi); 2282 assembler.Bind(&if_keyispositivesmi);
2207 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, 2283 assembler.TailCallRuntime(Runtime::kLoadElementWithInterceptor, context,
2208 receiver, key); 2284 receiver, key);
2209 2285
2210 assembler->Bind(&if_keyisinvalid); 2286 assembler.Bind(&if_keyisinvalid);
2211 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, 2287 assembler.TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key,
2212 slot, vector); 2288 slot, vector);
2213 } 2289 }
2214 2290
2215 // static 2291 // static
2216 bool FastCloneShallowObjectStub::IsSupported(ObjectLiteral* expr) { 2292 bool FastCloneShallowObjectStub::IsSupported(ObjectLiteral* expr) {
2217 // FastCloneShallowObjectStub doesn't copy elements, and object literals don't 2293 // FastCloneShallowObjectStub doesn't copy elements, and object literals don't
2218 // support copy-on-write (COW) elements for now. 2294 // support copy-on-write (COW) elements for now.
2219 // TODO(mvstanton): make object literals support COW elements. 2295 // TODO(mvstanton): make object literals support COW elements.
2220 return expr->fast_elements() && expr->has_shallow_properties() && 2296 return expr->fast_elements() && expr->has_shallow_properties() &&
2221 expr->properties_count() <= kMaximumClonedProperties; 2297 expr->properties_count() <= kMaximumClonedProperties;
2222 } 2298 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
2309 assembler->StoreObjectFieldNoWriteBarrier( 2385 assembler->StoreObjectFieldNoWriteBarrier(
2310 allocation_site, AllocationSite::kPretenureCreateCountOffset, 2386 allocation_site, AllocationSite::kPretenureCreateCountOffset,
2311 memento_create_count); 2387 memento_create_count);
2312 } 2388 }
2313 2389
2314 // TODO(verwaest): Allocate and fill in double boxes. 2390 // TODO(verwaest): Allocate and fill in double boxes.
2315 return copy; 2391 return copy;
2316 } 2392 }
2317 2393
2318 void FastCloneShallowObjectStub::GenerateAssembly( 2394 void FastCloneShallowObjectStub::GenerateAssembly(
2319 CodeStubAssembler* assembler) const { 2395 compiler::CodeAssemblerState* state) const {
2320 typedef CodeStubAssembler::Label Label; 2396 typedef CodeStubAssembler::Label Label;
2321 typedef compiler::Node Node; 2397 typedef compiler::Node Node;
2322 Label call_runtime(assembler); 2398 CodeStubAssembler assembler(state);
2323 Node* closure = assembler->Parameter(0); 2399
2324 Node* literals_index = assembler->Parameter(1); 2400 Label call_runtime(&assembler);
2401 Node* closure = assembler.Parameter(0);
2402 Node* literals_index = assembler.Parameter(1);
2325 2403
2326 Node* properties_count = 2404 Node* properties_count =
2327 assembler->IntPtrConstant(PropertiesCount(this->length())); 2405 assembler.IntPtrConstant(PropertiesCount(this->length()));
2328 Node* copy = GenerateFastPath(assembler, &call_runtime, closure, 2406 Node* copy = GenerateFastPath(&assembler, &call_runtime, closure,
2329 literals_index, properties_count); 2407 literals_index, properties_count);
2330 assembler->Return(copy); 2408 assembler.Return(copy);
2331 2409
2332 assembler->Bind(&call_runtime); 2410 assembler.Bind(&call_runtime);
2333 Node* constant_properties = assembler->Parameter(2); 2411 Node* constant_properties = assembler.Parameter(2);
2334 Node* flags = assembler->Parameter(3); 2412 Node* flags = assembler.Parameter(3);
2335 Node* context = assembler->Parameter(4); 2413 Node* context = assembler.Parameter(4);
2336 assembler->TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure, 2414 assembler.TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure,
2337 literals_index, constant_properties, flags); 2415 literals_index, constant_properties, flags);
2338 } 2416 }
2339 2417
2340 template<class StateType> 2418 template<class StateType>
2341 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { 2419 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) {
2342 // Note: Although a no-op transition is semantically OK, it is hinting at a 2420 // Note: Although a no-op transition is semantically OK, it is hinting at a
2343 // bug somewhere in our state transition machinery. 2421 // bug somewhere in our state transition machinery.
2344 DCHECK(from != to); 2422 DCHECK(from != to);
2345 if (!FLAG_trace_ic) return; 2423 if (!FLAG_trace_ic) return;
2346 OFStream os(stdout); 2424 OFStream os(stdout);
2347 os << "["; 2425 os << "[";
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2420 descriptor->SetMissHandler(Runtime::kBinaryOpIC_Miss); 2498 descriptor->SetMissHandler(Runtime::kBinaryOpIC_Miss);
2421 } 2499 }
2422 2500
2423 2501
2424 void BinaryOpWithAllocationSiteStub::InitializeDescriptor( 2502 void BinaryOpWithAllocationSiteStub::InitializeDescriptor(
2425 CodeStubDescriptor* descriptor) { 2503 CodeStubDescriptor* descriptor) {
2426 descriptor->Initialize( 2504 descriptor->Initialize(
2427 FUNCTION_ADDR(Runtime_BinaryOpIC_MissWithAllocationSite)); 2505 FUNCTION_ADDR(Runtime_BinaryOpIC_MissWithAllocationSite));
2428 } 2506 }
2429 2507
2430 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { 2508 void GetPropertyStub::GenerateAssembly(
2509 compiler::CodeAssemblerState* state) const {
2431 typedef compiler::Node Node; 2510 typedef compiler::Node Node;
2432 typedef CodeStubAssembler::Label Label; 2511 typedef CodeStubAssembler::Label Label;
2433 typedef CodeStubAssembler::Variable Variable; 2512 typedef CodeStubAssembler::Variable Variable;
2513 CodeStubAssembler assembler(state);
2434 2514
2435 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), 2515 Label call_runtime(&assembler, Label::kDeferred),
2436 end(assembler); 2516 return_undefined(&assembler), end(&assembler);
2437 2517
2438 Node* object = assembler->Parameter(0); 2518 Node* object = assembler.Parameter(0);
2439 Node* key = assembler->Parameter(1); 2519 Node* key = assembler.Parameter(1);
2440 Node* context = assembler->Parameter(2); 2520 Node* context = assembler.Parameter(2);
2441 Variable var_result(assembler, MachineRepresentation::kTagged); 2521 Variable var_result(&assembler, MachineRepresentation::kTagged);
2442 2522
2443 CodeStubAssembler::LookupInHolder lookup_property_in_holder = 2523 CodeStubAssembler::LookupInHolder lookup_property_in_holder =
2444 [assembler, context, &var_result, &end]( 2524 [&assembler, context, &var_result, &end](
2445 Node* receiver, Node* holder, Node* holder_map, 2525 Node* receiver, Node* holder, Node* holder_map,
2446 Node* holder_instance_type, Node* unique_name, Label* next_holder, 2526 Node* holder_instance_type, Node* unique_name, Label* next_holder,
2447 Label* if_bailout) { 2527 Label* if_bailout) {
2448 Variable var_value(assembler, MachineRepresentation::kTagged); 2528 Variable var_value(&assembler, MachineRepresentation::kTagged);
2449 Label if_found(assembler); 2529 Label if_found(&assembler);
2450 assembler->TryGetOwnProperty( 2530 assembler.TryGetOwnProperty(
2451 context, receiver, holder, holder_map, holder_instance_type, 2531 context, receiver, holder, holder_map, holder_instance_type,
2452 unique_name, &if_found, &var_value, next_holder, if_bailout); 2532 unique_name, &if_found, &var_value, next_holder, if_bailout);
2453 assembler->Bind(&if_found); 2533 assembler.Bind(&if_found);
2454 { 2534 {
2455 var_result.Bind(var_value.value()); 2535 var_result.Bind(var_value.value());
2456 assembler->Goto(&end); 2536 assembler.Goto(&end);
2457 } 2537 }
2458 }; 2538 };
2459 2539
2460 CodeStubAssembler::LookupInHolder lookup_element_in_holder = 2540 CodeStubAssembler::LookupInHolder lookup_element_in_holder =
2461 [assembler, context, &var_result, &end]( 2541 [&assembler, context, &var_result, &end](
2462 Node* receiver, Node* holder, Node* holder_map, 2542 Node* receiver, Node* holder, Node* holder_map,
2463 Node* holder_instance_type, Node* index, Label* next_holder, 2543 Node* holder_instance_type, Node* index, Label* next_holder,
2464 Label* if_bailout) { 2544 Label* if_bailout) {
2465 // Not supported yet. 2545 // Not supported yet.
2466 assembler->Use(next_holder); 2546 assembler.Use(next_holder);
2467 assembler->Goto(if_bailout); 2547 assembler.Goto(if_bailout);
2468 }; 2548 };
2469 2549
2470 assembler->TryPrototypeChainLookup(object, key, lookup_property_in_holder, 2550 assembler.TryPrototypeChainLookup(object, key, lookup_property_in_holder,
2471 lookup_element_in_holder, 2551 lookup_element_in_holder, &return_undefined,
2472 &return_undefined, &call_runtime); 2552 &call_runtime);
2473 2553
2474 assembler->Bind(&return_undefined); 2554 assembler.Bind(&return_undefined);
2475 { 2555 {
2476 var_result.Bind(assembler->UndefinedConstant()); 2556 var_result.Bind(assembler.UndefinedConstant());
2477 assembler->Goto(&end); 2557 assembler.Goto(&end);
2478 } 2558 }
2479 2559
2480 assembler->Bind(&call_runtime); 2560 assembler.Bind(&call_runtime);
2481 { 2561 {
2482 var_result.Bind( 2562 var_result.Bind(
2483 assembler->CallRuntime(Runtime::kGetProperty, context, object, key)); 2563 assembler.CallRuntime(Runtime::kGetProperty, context, object, key));
2484 assembler->Goto(&end); 2564 assembler.Goto(&end);
2485 } 2565 }
2486 2566
2487 assembler->Bind(&end); 2567 assembler.Bind(&end);
2488 assembler->Return(var_result.value()); 2568 assembler.Return(var_result.value());
2489 } 2569 }
2490 2570
2491 // static 2571 // static
2492 compiler::Node* FastNewClosureStub::Generate(CodeStubAssembler* assembler, 2572 compiler::Node* FastNewClosureStub::Generate(CodeStubAssembler* assembler,
2493 compiler::Node* shared_info, 2573 compiler::Node* shared_info,
2494 compiler::Node* context) { 2574 compiler::Node* context) {
2495 typedef compiler::Node Node; 2575 typedef compiler::Node Node;
2496 typedef compiler::CodeAssembler::Label Label; 2576 typedef compiler::CodeAssembler::Label Label;
2497 typedef compiler::CodeAssembler::Variable Variable; 2577 typedef compiler::CodeAssembler::Variable Variable;
2498 2578
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
2632 assembler->IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); 2712 assembler->IntPtrConstant(Code::kHeaderSize - kHeapObjectTag));
2633 assembler->StoreObjectFieldNoWriteBarrier( 2713 assembler->StoreObjectFieldNoWriteBarrier(
2634 result, JSFunction::kCodeEntryOffset, lazy_builtin_entry); 2714 result, JSFunction::kCodeEntryOffset, lazy_builtin_entry);
2635 assembler->StoreObjectFieldNoWriteBarrier(result, 2715 assembler->StoreObjectFieldNoWriteBarrier(result,
2636 JSFunction::kNextFunctionLinkOffset, 2716 JSFunction::kNextFunctionLinkOffset,
2637 assembler->UndefinedConstant()); 2717 assembler->UndefinedConstant());
2638 2718
2639 return result; 2719 return result;
2640 } 2720 }
2641 2721
2642 void FastNewClosureStub::GenerateAssembly(CodeStubAssembler* assembler) const { 2722 void FastNewClosureStub::GenerateAssembly(
2643 assembler->Return( 2723 compiler::CodeAssemblerState* state) const {
2644 Generate(assembler, assembler->Parameter(0), assembler->Parameter(1))); 2724 CodeStubAssembler assembler(state);
2725 assembler.Return(
2726 Generate(&assembler, assembler.Parameter(0), assembler.Parameter(1)));
2645 } 2727 }
2646 2728
2647 // static 2729 // static
2648 compiler::Node* FastNewFunctionContextStub::Generate( 2730 compiler::Node* FastNewFunctionContextStub::Generate(
2649 CodeStubAssembler* assembler, compiler::Node* function, 2731 CodeStubAssembler* assembler, compiler::Node* function,
2650 compiler::Node* slots, compiler::Node* context) { 2732 compiler::Node* slots, compiler::Node* context) {
2651 typedef compiler::Node Node; 2733 typedef compiler::Node Node;
2652 2734
2653 Node* min_context_slots = 2735 Node* min_context_slots =
2654 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS); 2736 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2691 function_context, FAST_ELEMENTS, min_context_slots, length, 2773 function_context, FAST_ELEMENTS, min_context_slots, length,
2692 [undefined](CodeStubAssembler* assembler, Node* context, Node* offset) { 2774 [undefined](CodeStubAssembler* assembler, Node* context, Node* offset) {
2693 assembler->StoreNoWriteBarrier(MachineType::PointerRepresentation(), 2775 assembler->StoreNoWriteBarrier(MachineType::PointerRepresentation(),
2694 context, offset, undefined); 2776 context, offset, undefined);
2695 }); 2777 });
2696 2778
2697 return function_context; 2779 return function_context;
2698 } 2780 }
2699 2781
2700 void FastNewFunctionContextStub::GenerateAssembly( 2782 void FastNewFunctionContextStub::GenerateAssembly(
2701 CodeStubAssembler* assembler) const { 2783 compiler::CodeAssemblerState* state) const {
2702 typedef compiler::Node Node; 2784 typedef compiler::Node Node;
2703 Node* function = assembler->Parameter(Descriptor::kFunction); 2785 CodeStubAssembler assembler(state);
2704 Node* slots = assembler->Parameter(FastNewFunctionContextDescriptor::kSlots); 2786 Node* function = assembler.Parameter(Descriptor::kFunction);
2705 Node* context = assembler->Parameter(Descriptor::kContext); 2787 Node* slots = assembler.Parameter(FastNewFunctionContextDescriptor::kSlots);
2788 Node* context = assembler.Parameter(Descriptor::kContext);
2706 2789
2707 assembler->Return(Generate(assembler, function, slots, context)); 2790 assembler.Return(Generate(&assembler, function, slots, context));
2708 } 2791 }
2709 2792
2710 // static 2793 // static
2711 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, 2794 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler,
2712 compiler::Node* closure, 2795 compiler::Node* closure,
2713 compiler::Node* literal_index, 2796 compiler::Node* literal_index,
2714 compiler::Node* pattern, 2797 compiler::Node* pattern,
2715 compiler::Node* flags, 2798 compiler::Node* flags,
2716 compiler::Node* context) { 2799 compiler::Node* context) {
2717 typedef CodeStubAssembler::Label Label; 2800 typedef CodeStubAssembler::Label Label;
(...skipping 27 matching lines...) Expand all
2745 { 2828 {
2746 result.Bind(assembler->CallRuntime(Runtime::kCreateRegExpLiteral, context, 2829 result.Bind(assembler->CallRuntime(Runtime::kCreateRegExpLiteral, context,
2747 closure, literal_index, pattern, flags)); 2830 closure, literal_index, pattern, flags));
2748 assembler->Goto(&end); 2831 assembler->Goto(&end);
2749 } 2832 }
2750 2833
2751 assembler->Bind(&end); 2834 assembler->Bind(&end);
2752 return result.value(); 2835 return result.value();
2753 } 2836 }
2754 2837
2755 void FastCloneRegExpStub::GenerateAssembly(CodeStubAssembler* assembler) const { 2838 void FastCloneRegExpStub::GenerateAssembly(
2839 compiler::CodeAssemblerState* state) const {
2756 typedef compiler::Node Node; 2840 typedef compiler::Node Node;
2757 Node* closure = assembler->Parameter(Descriptor::kClosure); 2841 CodeStubAssembler assembler(state);
2758 Node* literal_index = assembler->Parameter(Descriptor::kLiteralIndex); 2842 Node* closure = assembler.Parameter(Descriptor::kClosure);
2759 Node* pattern = assembler->Parameter(Descriptor::kPattern); 2843 Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex);
2760 Node* flags = assembler->Parameter(Descriptor::kFlags); 2844 Node* pattern = assembler.Parameter(Descriptor::kPattern);
2761 Node* context = assembler->Parameter(Descriptor::kContext); 2845 Node* flags = assembler.Parameter(Descriptor::kFlags);
2846 Node* context = assembler.Parameter(Descriptor::kContext);
2762 2847
2763 assembler->Return( 2848 assembler.Return(
2764 Generate(assembler, closure, literal_index, pattern, flags, context)); 2849 Generate(&assembler, closure, literal_index, pattern, flags, context));
2765 } 2850 }
2766 2851
2767 namespace { 2852 namespace {
2768 2853
2769 compiler::Node* NonEmptyShallowClone(CodeStubAssembler* assembler, 2854 compiler::Node* NonEmptyShallowClone(CodeStubAssembler* assembler,
2770 compiler::Node* boilerplate, 2855 compiler::Node* boilerplate,
2771 compiler::Node* boilerplate_map, 2856 compiler::Node* boilerplate_map,
2772 compiler::Node* boilerplate_elements, 2857 compiler::Node* boilerplate_elements,
2773 compiler::Node* allocation_site, 2858 compiler::Node* allocation_site,
2774 compiler::Node* capacity, 2859 compiler::Node* capacity,
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
2919 elements.value()); 3004 elements.value());
2920 result.Bind(array); 3005 result.Bind(array);
2921 assembler->Goto(&return_result); 3006 assembler->Goto(&return_result);
2922 } 3007 }
2923 3008
2924 assembler->Bind(&return_result); 3009 assembler->Bind(&return_result);
2925 return result.value(); 3010 return result.value();
2926 } 3011 }
2927 3012
2928 void FastCloneShallowArrayStub::GenerateAssembly( 3013 void FastCloneShallowArrayStub::GenerateAssembly(
2929 CodeStubAssembler* assembler) const { 3014 compiler::CodeAssemblerState* state) const {
2930 typedef compiler::Node Node; 3015 typedef compiler::Node Node;
2931 typedef CodeStubAssembler::Label Label; 3016 typedef CodeStubAssembler::Label Label;
2932 Node* closure = assembler->Parameter(Descriptor::kClosure); 3017 CodeStubAssembler assembler(state);
2933 Node* literal_index = assembler->Parameter(Descriptor::kLiteralIndex);
2934 Node* constant_elements = assembler->Parameter(Descriptor::kConstantElements);
2935 Node* context = assembler->Parameter(Descriptor::kContext);
2936 Label call_runtime(assembler, Label::kDeferred);
2937 assembler->Return(Generate(assembler, closure, literal_index, context,
2938 &call_runtime, allocation_site_mode()));
2939 3018
2940 assembler->Bind(&call_runtime); 3019 Node* closure = assembler.Parameter(Descriptor::kClosure);
3020 Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex);
3021 Node* constant_elements = assembler.Parameter(Descriptor::kConstantElements);
3022 Node* context = assembler.Parameter(Descriptor::kContext);
3023 Label call_runtime(&assembler, Label::kDeferred);
3024 assembler.Return(Generate(&assembler, closure, literal_index, context,
3025 &call_runtime, allocation_site_mode()));
3026
3027 assembler.Bind(&call_runtime);
2941 { 3028 {
2942 assembler->Comment("call runtime"); 3029 assembler.Comment("call runtime");
2943 Node* flags = assembler->SmiConstant( 3030 Node* flags = assembler.SmiConstant(
2944 Smi::FromInt(ArrayLiteral::kShallowElements | 3031 Smi::FromInt(ArrayLiteral::kShallowElements |
2945 (allocation_site_mode() == TRACK_ALLOCATION_SITE 3032 (allocation_site_mode() == TRACK_ALLOCATION_SITE
2946 ? 0 3033 ? 0
2947 : ArrayLiteral::kDisableMementos))); 3034 : ArrayLiteral::kDisableMementos)));
2948 assembler->Return(assembler->CallRuntime(Runtime::kCreateArrayLiteral, 3035 assembler.Return(assembler.CallRuntime(Runtime::kCreateArrayLiteral,
2949 context, closure, literal_index, 3036 context, closure, literal_index,
2950 constant_elements, flags)); 3037 constant_elements, flags));
2951 } 3038 }
2952 } 3039 }
2953 3040
2954 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { 3041 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) {
2955 CreateAllocationSiteStub stub(isolate); 3042 CreateAllocationSiteStub stub(isolate);
2956 stub.GetCode(); 3043 stub.GetCode();
2957 } 3044 }
2958 3045
2959 3046
2960 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) { 3047 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) {
2961 CreateWeakCellStub stub(isolate); 3048 CreateWeakCellStub stub(isolate);
2962 stub.GetCode(); 3049 stub.GetCode();
2963 } 3050 }
2964 3051
2965 3052
2966 void StoreElementStub::Generate(MacroAssembler* masm) { 3053 void StoreElementStub::Generate(MacroAssembler* masm) {
2967 DCHECK_EQ(DICTIONARY_ELEMENTS, elements_kind()); 3054 DCHECK_EQ(DICTIONARY_ELEMENTS, elements_kind());
2968 KeyedStoreIC::GenerateSlow(masm); 3055 KeyedStoreIC::GenerateSlow(masm);
2969 } 3056 }
2970 3057
2971 void StoreFastElementStub::GenerateAssembly( 3058 void StoreFastElementStub::GenerateAssembly(
2972 CodeStubAssembler* assembler) const { 3059 compiler::CodeAssemblerState* state) const {
2973 typedef CodeStubAssembler::Label Label; 3060 typedef CodeStubAssembler::Label Label;
2974 typedef compiler::Node Node; 3061 typedef compiler::Node Node;
3062 CodeStubAssembler assembler(state);
2975 3063
2976 assembler->Comment( 3064 assembler.Comment(
2977 "StoreFastElementStub: js_array=%d, elements_kind=%s, store_mode=%d", 3065 "StoreFastElementStub: js_array=%d, elements_kind=%s, store_mode=%d",
2978 is_js_array(), ElementsKindToString(elements_kind()), store_mode()); 3066 is_js_array(), ElementsKindToString(elements_kind()), store_mode());
2979 3067
2980 Node* receiver = assembler->Parameter(Descriptor::kReceiver); 3068 Node* receiver = assembler.Parameter(Descriptor::kReceiver);
2981 Node* key = assembler->Parameter(Descriptor::kName); 3069 Node* key = assembler.Parameter(Descriptor::kName);
2982 Node* value = assembler->Parameter(Descriptor::kValue); 3070 Node* value = assembler.Parameter(Descriptor::kValue);
2983 Node* slot = assembler->Parameter(Descriptor::kSlot); 3071 Node* slot = assembler.Parameter(Descriptor::kSlot);
2984 Node* vector = assembler->Parameter(Descriptor::kVector); 3072 Node* vector = assembler.Parameter(Descriptor::kVector);
2985 Node* context = assembler->Parameter(Descriptor::kContext); 3073 Node* context = assembler.Parameter(Descriptor::kContext);
2986 3074
2987 Label miss(assembler); 3075 Label miss(&assembler);
2988 3076
2989 assembler->EmitElementStore(receiver, key, value, is_js_array(), 3077 assembler.EmitElementStore(receiver, key, value, is_js_array(),
2990 elements_kind(), store_mode(), &miss); 3078 elements_kind(), store_mode(), &miss);
2991 assembler->Return(value); 3079 assembler.Return(value);
2992 3080
2993 assembler->Bind(&miss); 3081 assembler.Bind(&miss);
2994 { 3082 {
2995 assembler->Comment("Miss"); 3083 assembler.Comment("Miss");
2996 assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, 3084 assembler.TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, slot,
2997 slot, vector, receiver, key); 3085 vector, receiver, key);
2998 } 3086 }
2999 } 3087 }
3000 3088
3001 // static 3089 // static
3002 void StoreFastElementStub::GenerateAheadOfTime(Isolate* isolate) { 3090 void StoreFastElementStub::GenerateAheadOfTime(Isolate* isolate) {
3003 if (FLAG_minimal) return; 3091 if (FLAG_minimal) return;
3004 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS, STANDARD_STORE) 3092 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS, STANDARD_STORE)
3005 .GetCode(); 3093 .GetCode();
3006 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS, 3094 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS,
3007 STORE_AND_GROW_NO_TRANSITION).GetCode(); 3095 STORE_AND_GROW_NO_TRANSITION).GetCode();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3071 3159
3072 void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function, 3160 void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function,
3073 intptr_t stack_pointer, 3161 intptr_t stack_pointer,
3074 Isolate* isolate) { 3162 Isolate* isolate) {
3075 FunctionEntryHook entry_hook = isolate->function_entry_hook(); 3163 FunctionEntryHook entry_hook = isolate->function_entry_hook();
3076 DCHECK(entry_hook != NULL); 3164 DCHECK(entry_hook != NULL);
3077 entry_hook(function, stack_pointer); 3165 entry_hook(function, stack_pointer);
3078 } 3166 }
3079 3167
3080 void CreateAllocationSiteStub::GenerateAssembly( 3168 void CreateAllocationSiteStub::GenerateAssembly(
3081 CodeStubAssembler* assembler) const { 3169 compiler::CodeAssemblerState* state) const {
3082 assembler->Return(assembler->CreateAllocationSiteInFeedbackVector( 3170 CodeStubAssembler assembler(state);
3083 assembler->Parameter(Descriptor::kVector), 3171 assembler.Return(assembler.CreateAllocationSiteInFeedbackVector(
3084 assembler->Parameter(Descriptor::kSlot))); 3172 assembler.Parameter(Descriptor::kVector),
3173 assembler.Parameter(Descriptor::kSlot)));
3085 } 3174 }
3086 3175
3087 void CreateWeakCellStub::GenerateAssembly(CodeStubAssembler* assembler) const { 3176 void CreateWeakCellStub::GenerateAssembly(
3088 assembler->Return(assembler->CreateWeakCellInFeedbackVector( 3177 compiler::CodeAssemblerState* state) const {
3089 assembler->Parameter(Descriptor::kVector), 3178 CodeStubAssembler assembler(state);
3090 assembler->Parameter(Descriptor::kSlot), 3179 assembler.Return(assembler.CreateWeakCellInFeedbackVector(
3091 assembler->Parameter(Descriptor::kValue))); 3180 assembler.Parameter(Descriptor::kVector),
3181 assembler.Parameter(Descriptor::kSlot),
3182 assembler.Parameter(Descriptor::kValue)));
3092 } 3183 }
3093 3184
3094 void ArrayNoArgumentConstructorStub::GenerateAssembly( 3185 void ArrayNoArgumentConstructorStub::GenerateAssembly(
3095 CodeStubAssembler* assembler) const { 3186 compiler::CodeAssemblerState* state) const {
3096 typedef compiler::Node Node; 3187 typedef compiler::Node Node;
3097 Node* native_context = assembler->LoadObjectField( 3188 CodeStubAssembler assembler(state);
3098 assembler->Parameter(Descriptor::kFunction), JSFunction::kContextOffset); 3189 Node* native_context = assembler.LoadObjectField(
3190 assembler.Parameter(Descriptor::kFunction), JSFunction::kContextOffset);
3099 bool track_allocation_site = 3191 bool track_allocation_site =
3100 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && 3192 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE &&
3101 override_mode() != DISABLE_ALLOCATION_SITES; 3193 override_mode() != DISABLE_ALLOCATION_SITES;
3102 Node* allocation_site = 3194 Node* allocation_site = track_allocation_site
3103 track_allocation_site ? assembler->Parameter(Descriptor::kAllocationSite) 3195 ? assembler.Parameter(Descriptor::kAllocationSite)
3104 : nullptr; 3196 : nullptr;
3105 Node* array_map = 3197 Node* array_map =
3106 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); 3198 assembler.LoadJSArrayElementsMap(elements_kind(), native_context);
3107 Node* array = assembler->AllocateJSArray( 3199 Node* array = assembler.AllocateJSArray(
3108 elements_kind(), array_map, 3200 elements_kind(), array_map,
3109 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), 3201 assembler.IntPtrConstant(JSArray::kPreallocatedArrayElements),
3110 assembler->SmiConstant(Smi::kZero), allocation_site); 3202 assembler.SmiConstant(Smi::kZero), allocation_site);
3111 assembler->Return(array); 3203 assembler.Return(array);
3112 } 3204 }
3113 3205
3114 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( 3206 void InternalArrayNoArgumentConstructorStub::GenerateAssembly(
3115 CodeStubAssembler* assembler) const { 3207 compiler::CodeAssemblerState* state) const {
3116 typedef compiler::Node Node; 3208 typedef compiler::Node Node;
3209 CodeStubAssembler assembler(state);
3117 Node* array_map = 3210 Node* array_map =
3118 assembler->LoadObjectField(assembler->Parameter(Descriptor::kFunction), 3211 assembler.LoadObjectField(assembler.Parameter(Descriptor::kFunction),
3119 JSFunction::kPrototypeOrInitialMapOffset); 3212 JSFunction::kPrototypeOrInitialMapOffset);
3120 Node* array = assembler->AllocateJSArray( 3213 Node* array = assembler.AllocateJSArray(
3121 elements_kind(), array_map, 3214 elements_kind(), array_map,
3122 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), 3215 assembler.IntPtrConstant(JSArray::kPreallocatedArrayElements),
3123 assembler->SmiConstant(Smi::kZero), nullptr); 3216 assembler.SmiConstant(Smi::kZero), nullptr);
3124 assembler->Return(array); 3217 assembler.Return(array);
3125 } 3218 }
3126 3219
3127 namespace { 3220 namespace {
3128 3221
3129 template <typename Descriptor> 3222 template <typename Descriptor>
3130 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, 3223 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler,
3131 ElementsKind elements_kind, 3224 ElementsKind elements_kind,
3132 compiler::Node* array_map, 3225 compiler::Node* array_map,
3133 compiler::Node* allocation_site, 3226 compiler::Node* allocation_site,
3134 AllocationSiteMode mode) { 3227 AllocationSiteMode mode) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3184 Node* function = assembler->Parameter(Descriptor::kFunction); 3277 Node* function = assembler->Parameter(Descriptor::kFunction);
3185 Node* array_size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); 3278 Node* array_size = assembler->Parameter(Descriptor::kArraySizeSmiParameter);
3186 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); 3279 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite);
3187 assembler->TailCallRuntime(Runtime::kNewArray, context, function, 3280 assembler->TailCallRuntime(Runtime::kNewArray, context, function,
3188 array_size, function, allocation_site); 3281 array_size, function, allocation_site);
3189 } 3282 }
3190 } 3283 }
3191 } // namespace 3284 } // namespace
3192 3285
3193 void ArraySingleArgumentConstructorStub::GenerateAssembly( 3286 void ArraySingleArgumentConstructorStub::GenerateAssembly(
3194 CodeStubAssembler* assembler) const { 3287 compiler::CodeAssemblerState* state) const {
3195 typedef compiler::Node Node; 3288 typedef compiler::Node Node;
3196 Node* function = assembler->Parameter(Descriptor::kFunction); 3289 CodeStubAssembler assembler(state);
3290 Node* function = assembler.Parameter(Descriptor::kFunction);
3197 Node* native_context = 3291 Node* native_context =
3198 assembler->LoadObjectField(function, JSFunction::kContextOffset); 3292 assembler.LoadObjectField(function, JSFunction::kContextOffset);
3199 Node* array_map = 3293 Node* array_map =
3200 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); 3294 assembler.LoadJSArrayElementsMap(elements_kind(), native_context);
3201 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES 3295 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES
3202 ? DONT_TRACK_ALLOCATION_SITE 3296 ? DONT_TRACK_ALLOCATION_SITE
3203 : AllocationSite::GetMode(elements_kind()); 3297 : AllocationSite::GetMode(elements_kind());
3204 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); 3298 Node* allocation_site = assembler.Parameter(Descriptor::kAllocationSite);
3205 SingleArgumentConstructorCommon<Descriptor>(assembler, elements_kind(), 3299 SingleArgumentConstructorCommon<Descriptor>(&assembler, elements_kind(),
3206 array_map, allocation_site, mode); 3300 array_map, allocation_site, mode);
3207 } 3301 }
3208 3302
3209 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( 3303 void InternalArraySingleArgumentConstructorStub::GenerateAssembly(
3210 CodeStubAssembler* assembler) const { 3304 compiler::CodeAssemblerState* state) const {
3211 typedef compiler::Node Node; 3305 typedef compiler::Node Node;
3212 Node* function = assembler->Parameter(Descriptor::kFunction); 3306 CodeStubAssembler assembler(state);
3213 Node* array_map = assembler->LoadObjectField( 3307 Node* function = assembler.Parameter(Descriptor::kFunction);
3308 Node* array_map = assembler.LoadObjectField(
3214 function, JSFunction::kPrototypeOrInitialMapOffset); 3309 function, JSFunction::kPrototypeOrInitialMapOffset);
3215 SingleArgumentConstructorCommon<Descriptor>( 3310 SingleArgumentConstructorCommon<Descriptor>(
3216 assembler, elements_kind(), array_map, assembler->UndefinedConstant(), 3311 &assembler, elements_kind(), array_map, assembler.UndefinedConstant(),
3217 DONT_TRACK_ALLOCATION_SITE); 3312 DONT_TRACK_ALLOCATION_SITE);
3218 } 3313 }
3219 3314
3220 void GrowArrayElementsStub::GenerateAssembly( 3315 void GrowArrayElementsStub::GenerateAssembly(
3221 CodeStubAssembler* assembler) const { 3316 compiler::CodeAssemblerState* state) const {
3222 typedef compiler::Node Node; 3317 typedef compiler::Node Node;
3223 CodeStubAssembler::Label runtime(assembler, 3318 CodeStubAssembler assembler(state);
3319 CodeStubAssembler::Label runtime(&assembler,
3224 CodeStubAssembler::Label::kDeferred); 3320 CodeStubAssembler::Label::kDeferred);
3225 3321
3226 Node* object = assembler->Parameter(Descriptor::kObject); 3322 Node* object = assembler.Parameter(Descriptor::kObject);
3227 Node* key = assembler->Parameter(Descriptor::kKey); 3323 Node* key = assembler.Parameter(Descriptor::kKey);
3228 Node* context = assembler->Parameter(Descriptor::kContext); 3324 Node* context = assembler.Parameter(Descriptor::kContext);
3229 ElementsKind kind = elements_kind(); 3325 ElementsKind kind = elements_kind();
3230 3326
3231 Node* elements = assembler->LoadElements(object); 3327 Node* elements = assembler.LoadElements(object);
3232 Node* new_elements = 3328 Node* new_elements =
3233 assembler->TryGrowElementsCapacity(object, elements, kind, key, &runtime); 3329 assembler.TryGrowElementsCapacity(object, elements, kind, key, &runtime);
3234 assembler->Return(new_elements); 3330 assembler.Return(new_elements);
3235 3331
3236 assembler->Bind(&runtime); 3332 assembler.Bind(&runtime);
3237 // TODO(danno): Make this a tail call when the stub is only used from TurboFan 3333 // TODO(danno): Make this a tail call when the stub is only used from TurboFan
3238 // code. This musn't be a tail call for now, since the caller site in lithium 3334 // code. This musn't be a tail call for now, since the caller site in lithium
3239 // creates a safepoint. This safepoint musn't have a different number of 3335 // creates a safepoint. This safepoint musn't have a different number of
3240 // arguments on the stack in the case that a GC happens from the slow-case 3336 // arguments on the stack in the case that a GC happens from the slow-case
3241 // allocation path (zero, since all the stubs inputs are in registers) and 3337 // allocation path (zero, since all the stubs inputs are in registers) and
3242 // when the call happens (it would be two in the tail call case due to the 3338 // when the call happens (it would be two in the tail call case due to the
3243 // tail call pushing the arguments on the stack for the runtime call). By not 3339 // tail call pushing the arguments on the stack for the runtime call). By not
3244 // tail-calling, the runtime call case also has zero arguments on the stack 3340 // tail-calling, the runtime call case also has zero arguments on the stack
3245 // for the stub frame. 3341 // for the stub frame.
3246 assembler->Return(assembler->CallRuntime(Runtime::kGrowArrayElements, context, 3342 assembler.Return(
3247 object, key)); 3343 assembler.CallRuntime(Runtime::kGrowArrayElements, context, object, key));
3248 } 3344 }
3249 3345
3250 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) 3346 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate)
3251 : PlatformCodeStub(isolate) {} 3347 : PlatformCodeStub(isolate) {}
3252 3348
3253 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) 3349 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate)
3254 : PlatformCodeStub(isolate) {} 3350 : PlatformCodeStub(isolate) {}
3255 3351
3256 } // namespace internal 3352 } // namespace internal
3257 } // namespace v8 3353 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stubs.h ('k') | src/code-stubs-hydrogen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698