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

Side by Side Diff: src/interpreter/interpreter.cc

Issue 2187603004: [stubs] Using template magic to get the call interface descriptor type from callable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@code-factory-cleanup
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/interpreter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/interpreter.h" 5 #include "src/interpreter/interpreter.h"
6 6
7 #include <fstream> 7 #include <fstream>
8 #include <memory> 8 #include <memory>
9 9
10 #include "src/ast/prettyprinter.h" 10 #include "src/ast/prettyprinter.h"
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 // 375 //
376 // Stores the value of register <src> to register <dst>. 376 // Stores the value of register <src> to register <dst>.
377 void Interpreter::DoMov(InterpreterAssembler* assembler) { 377 void Interpreter::DoMov(InterpreterAssembler* assembler) {
378 Node* src_index = __ BytecodeOperandReg(0); 378 Node* src_index = __ BytecodeOperandReg(0);
379 Node* src_value = __ LoadRegister(src_index); 379 Node* src_value = __ LoadRegister(src_index);
380 Node* dst_index = __ BytecodeOperandReg(1); 380 Node* dst_index = __ BytecodeOperandReg(1);
381 __ StoreRegister(src_value, dst_index); 381 __ StoreRegister(src_value, dst_index);
382 __ Dispatch(); 382 __ Dispatch();
383 } 383 }
384 384
385 template <typename Descriptor>
385 Node* Interpreter::BuildLoadGlobal(Callable ic, 386 Node* Interpreter::BuildLoadGlobal(Callable ic,
386 InterpreterAssembler* assembler) { 387 InterpreterAssembler* assembler) {
387 typedef LoadGlobalWithVectorDescriptor Descriptor;
388 // Get the global object. 388 // Get the global object.
389 Node* context = __ GetContext(); 389 Node* context = __ GetContext();
390 390
391 // Load the global via the LoadGlobalIC. 391 // Load the global via the LoadGlobalIC.
392 Node* code_target = __ HeapConstant(ic.code()); 392 Node* code_target = __ HeapConstant(ic.code());
393 Node* raw_slot = __ BytecodeOperandIdx(0); 393 Node* raw_slot = __ BytecodeOperandIdx(0);
394 Node* smi_slot = __ SmiTag(raw_slot); 394 Node* smi_slot = __ SmiTag(raw_slot);
395 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 395 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
396 return __ CallStub(ic.descriptor(), code_target, context, 396 return __ CallStub(ic.descriptor(), code_target, context,
397 Arg(Descriptor::kSlot, smi_slot), 397 Arg(Descriptor::kSlot, smi_slot),
398 Arg(Descriptor::kVector, type_feedback_vector)); 398 Arg(Descriptor::kVector, type_feedback_vector));
399 } 399 }
400 400
401 // LdaGlobal <slot> 401 // LdaGlobal <slot>
402 // 402 //
403 // Load the global with name in constant pool entry <name_index> into the 403 // Load the global with name in constant pool entry <name_index> into the
404 // accumulator using FeedBackVector slot <slot> outside of a typeof. 404 // accumulator using FeedBackVector slot <slot> outside of a typeof.
405 void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) { 405 void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) {
406 Callable ic = 406 auto ic =
407 CodeFactory::LoadGlobalICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF); 407 CodeFactory::LoadGlobalICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF);
408 Node* result = BuildLoadGlobal(ic, assembler); 408 typedef decltype(ic)::Descriptor Descriptor;
409 Node* result = BuildLoadGlobal<Descriptor>(ic, assembler);
409 __ SetAccumulator(result); 410 __ SetAccumulator(result);
410 __ Dispatch(); 411 __ Dispatch();
411 } 412 }
412 413
413 // LdrGlobal <slot> <reg> 414 // LdrGlobal <slot> <reg>
414 // 415 //
415 // Load the global with name in constant pool entry <name_index> into 416 // Load the global with name in constant pool entry <name_index> into
416 // register <reg> using FeedBackVector slot <slot> outside of a typeof. 417 // register <reg> using FeedBackVector slot <slot> outside of a typeof.
417 void Interpreter::DoLdrGlobal(InterpreterAssembler* assembler) { 418 void Interpreter::DoLdrGlobal(InterpreterAssembler* assembler) {
418 Callable ic = 419 auto ic =
419 CodeFactory::LoadGlobalICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF); 420 CodeFactory::LoadGlobalICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF);
420 Node* result = BuildLoadGlobal(ic, assembler); 421 typedef decltype(ic)::Descriptor Descriptor;
422 Node* result = BuildLoadGlobal<Descriptor>(ic, assembler);
421 Node* destination = __ BytecodeOperandReg(1); 423 Node* destination = __ BytecodeOperandReg(1);
422 __ StoreRegister(result, destination); 424 __ StoreRegister(result, destination);
423 __ Dispatch(); 425 __ Dispatch();
424 } 426 }
425 427
426 // LdaGlobalInsideTypeof <slot> 428 // LdaGlobalInsideTypeof <slot>
427 // 429 //
428 // Load the global with name in constant pool entry <name_index> into the 430 // Load the global with name in constant pool entry <name_index> into the
429 // accumulator using FeedBackVector slot <slot> inside of a typeof. 431 // accumulator using FeedBackVector slot <slot> inside of a typeof.
430 void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) { 432 void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) {
431 Callable ic = 433 auto ic = CodeFactory::LoadGlobalICInOptimizedCode(isolate_, INSIDE_TYPEOF);
432 CodeFactory::LoadGlobalICInOptimizedCode(isolate_, INSIDE_TYPEOF); 434 typedef decltype(ic)::Descriptor Descriptor;
433 Node* result = BuildLoadGlobal(ic, assembler); 435 Node* result = BuildLoadGlobal<Descriptor>(ic, assembler);
434 __ SetAccumulator(result); 436 __ SetAccumulator(result);
435 __ Dispatch(); 437 __ Dispatch();
436 } 438 }
437 439
440 template <typename Descriptor>
438 void Interpreter::DoStaGlobal(Callable ic, InterpreterAssembler* assembler) { 441 void Interpreter::DoStaGlobal(Callable ic, InterpreterAssembler* assembler) {
439 typedef StoreWithVectorDescriptor Descriptor;
440 // Get the global object. 442 // Get the global object.
441 Node* context = __ GetContext(); 443 Node* context = __ GetContext();
442 Node* native_context = 444 Node* native_context =
443 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); 445 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX);
444 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); 446 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX);
445 447
446 // Store the global via the StoreIC. 448 // Store the global via the StoreIC.
447 Node* code_target = __ HeapConstant(ic.code()); 449 Node* code_target = __ HeapConstant(ic.code());
448 Node* constant_index = __ BytecodeOperandIdx(0); 450 Node* constant_index = __ BytecodeOperandIdx(0);
449 Node* name = __ LoadConstantPoolEntry(constant_index); 451 Node* name = __ LoadConstantPoolEntry(constant_index);
450 Node* value = __ GetAccumulator(); 452 Node* value = __ GetAccumulator();
451 Node* raw_slot = __ BytecodeOperandIdx(1); 453 Node* raw_slot = __ BytecodeOperandIdx(1);
452 Node* smi_slot = __ SmiTag(raw_slot); 454 Node* smi_slot = __ SmiTag(raw_slot);
453 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 455 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
454 __ CallStub(ic.descriptor(), code_target, context, 456 __ CallStub(ic.descriptor(), code_target, context,
455 Arg(Descriptor::kReceiver, global), Arg(Descriptor::kName, name), 457 Arg(Descriptor::kReceiver, global), Arg(Descriptor::kName, name),
456 Arg(Descriptor::kValue, value), Arg(Descriptor::kSlot, smi_slot), 458 Arg(Descriptor::kValue, value), Arg(Descriptor::kSlot, smi_slot),
457 Arg(Descriptor::kVector, type_feedback_vector)); 459 Arg(Descriptor::kVector, type_feedback_vector));
458 __ Dispatch(); 460 __ Dispatch();
459 } 461 }
460 462
461 // StaGlobalSloppy <name_index> <slot> 463 // StaGlobalSloppy <name_index> <slot>
462 // 464 //
463 // Store the value in the accumulator into the global with name in constant pool 465 // Store the value in the accumulator into the global with name in constant pool
464 // entry <name_index> using FeedBackVector slot <slot> in sloppy mode. 466 // entry <name_index> using FeedBackVector slot <slot> in sloppy mode.
465 void Interpreter::DoStaGlobalSloppy(InterpreterAssembler* assembler) { 467 void Interpreter::DoStaGlobalSloppy(InterpreterAssembler* assembler) {
466 Callable ic = CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY); 468 auto ic = CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY);
467 DoStaGlobal(ic, assembler); 469 typedef decltype(ic)::Descriptor Descriptor;
470 DoStaGlobal<Descriptor>(ic, assembler);
468 } 471 }
469 472
470 // StaGlobalStrict <name_index> <slot> 473 // StaGlobalStrict <name_index> <slot>
471 // 474 //
472 // Store the value in the accumulator into the global with name in constant pool 475 // Store the value in the accumulator into the global with name in constant pool
473 // entry <name_index> using FeedBackVector slot <slot> in strict mode. 476 // entry <name_index> using FeedBackVector slot <slot> in strict mode.
474 void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) { 477 void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) {
475 Callable ic = CodeFactory::StoreICInOptimizedCode(isolate_, STRICT); 478 auto ic = CodeFactory::StoreICInOptimizedCode(isolate_, STRICT);
476 DoStaGlobal(ic, assembler); 479 typedef decltype(ic)::Descriptor Descriptor;
480 DoStaGlobal<Descriptor>(ic, assembler);
477 } 481 }
478 482
479 compiler::Node* Interpreter::BuildLoadContextSlot( 483 compiler::Node* Interpreter::BuildLoadContextSlot(
480 InterpreterAssembler* assembler) { 484 InterpreterAssembler* assembler) {
481 Node* reg_index = __ BytecodeOperandReg(0); 485 Node* reg_index = __ BytecodeOperandReg(0);
482 Node* context = __ LoadRegister(reg_index); 486 Node* context = __ LoadRegister(reg_index);
483 Node* slot_index = __ BytecodeOperandIdx(1); 487 Node* slot_index = __ BytecodeOperandIdx(1);
484 return __ LoadContextSlot(context, slot_index); 488 return __ LoadContextSlot(context, slot_index);
485 } 489 }
486 490
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 } 568 }
565 569
566 // StaLookupSlotStrict <name_index> 570 // StaLookupSlotStrict <name_index>
567 // 571 //
568 // Store the object in accumulator to the object with the name in constant 572 // Store the object in accumulator to the object with the name in constant
569 // pool entry |name_index| in strict mode. 573 // pool entry |name_index| in strict mode.
570 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) { 574 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) {
571 DoStaLookupSlot(LanguageMode::STRICT, assembler); 575 DoStaLookupSlot(LanguageMode::STRICT, assembler);
572 } 576 }
573 577
578 template <typename Descriptor>
574 Node* Interpreter::BuildLoadNamedProperty(Callable ic, 579 Node* Interpreter::BuildLoadNamedProperty(Callable ic,
575 InterpreterAssembler* assembler) { 580 InterpreterAssembler* assembler) {
576 typedef LoadWithVectorDescriptor Descriptor;
577 Node* code_target = __ HeapConstant(ic.code()); 581 Node* code_target = __ HeapConstant(ic.code());
578 Node* register_index = __ BytecodeOperandReg(0); 582 Node* register_index = __ BytecodeOperandReg(0);
579 Node* object = __ LoadRegister(register_index); 583 Node* object = __ LoadRegister(register_index);
580 Node* constant_index = __ BytecodeOperandIdx(1); 584 Node* constant_index = __ BytecodeOperandIdx(1);
581 Node* name = __ LoadConstantPoolEntry(constant_index); 585 Node* name = __ LoadConstantPoolEntry(constant_index);
582 Node* raw_slot = __ BytecodeOperandIdx(2); 586 Node* raw_slot = __ BytecodeOperandIdx(2);
583 Node* smi_slot = __ SmiTag(raw_slot); 587 Node* smi_slot = __ SmiTag(raw_slot);
584 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 588 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
585 Node* context = __ GetContext(); 589 Node* context = __ GetContext();
586 return __ CallStub( 590 return __ CallStub(
587 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object), 591 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object),
588 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot), 592 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot),
589 Arg(Descriptor::kVector, type_feedback_vector)); 593 Arg(Descriptor::kVector, type_feedback_vector));
590 } 594 }
591 595
592 // LdaNamedProperty <object> <name_index> <slot> 596 // LdaNamedProperty <object> <name_index> <slot>
593 // 597 //
594 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at 598 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at
595 // constant pool entry <name_index>. 599 // constant pool entry <name_index>.
596 void Interpreter::DoLdaNamedProperty(InterpreterAssembler* assembler) { 600 void Interpreter::DoLdaNamedProperty(InterpreterAssembler* assembler) {
597 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_); 601 auto ic = CodeFactory::LoadICInOptimizedCode(isolate_);
598 Node* result = BuildLoadNamedProperty(ic, assembler); 602 typedef decltype(ic)::Descriptor Descriptor;
603 Node* result = BuildLoadNamedProperty<Descriptor>(ic, assembler);
599 __ SetAccumulator(result); 604 __ SetAccumulator(result);
600 __ Dispatch(); 605 __ Dispatch();
601 } 606 }
602 607
603 // LdrNamedProperty <object> <name_index> <slot> <reg> 608 // LdrNamedProperty <object> <name_index> <slot> <reg>
604 // 609 //
605 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at 610 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at
606 // constant pool entry <name_index> and puts the result into register <reg>. 611 // constant pool entry <name_index> and puts the result into register <reg>.
607 void Interpreter::DoLdrNamedProperty(InterpreterAssembler* assembler) { 612 void Interpreter::DoLdrNamedProperty(InterpreterAssembler* assembler) {
608 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_); 613 auto ic = CodeFactory::LoadICInOptimizedCode(isolate_);
609 Node* result = BuildLoadNamedProperty(ic, assembler); 614 typedef decltype(ic)::Descriptor Descriptor;
615 Node* result = BuildLoadNamedProperty<Descriptor>(ic, assembler);
610 Node* destination = __ BytecodeOperandReg(3); 616 Node* destination = __ BytecodeOperandReg(3);
611 __ StoreRegister(result, destination); 617 __ StoreRegister(result, destination);
612 __ Dispatch(); 618 __ Dispatch();
613 } 619 }
614 620
621 template <typename Descriptor>
615 Node* Interpreter::BuildLoadKeyedProperty(Callable ic, 622 Node* Interpreter::BuildLoadKeyedProperty(Callable ic,
616 InterpreterAssembler* assembler) { 623 InterpreterAssembler* assembler) {
617 typedef LoadWithVectorDescriptor Descriptor;
618 Node* code_target = __ HeapConstant(ic.code()); 624 Node* code_target = __ HeapConstant(ic.code());
619 Node* reg_index = __ BytecodeOperandReg(0); 625 Node* reg_index = __ BytecodeOperandReg(0);
620 Node* object = __ LoadRegister(reg_index); 626 Node* object = __ LoadRegister(reg_index);
621 Node* name = __ GetAccumulator(); 627 Node* name = __ GetAccumulator();
622 Node* raw_slot = __ BytecodeOperandIdx(1); 628 Node* raw_slot = __ BytecodeOperandIdx(1);
623 Node* smi_slot = __ SmiTag(raw_slot); 629 Node* smi_slot = __ SmiTag(raw_slot);
624 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 630 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
625 Node* context = __ GetContext(); 631 Node* context = __ GetContext();
626 return __ CallStub( 632 return __ CallStub(
627 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object), 633 ic.descriptor(), code_target, context, Arg(Descriptor::kReceiver, object),
628 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot), 634 Arg(Descriptor::kName, name), Arg(Descriptor::kSlot, smi_slot),
629 Arg(Descriptor::kVector, type_feedback_vector)); 635 Arg(Descriptor::kVector, type_feedback_vector));
630 } 636 }
631 637
632 // KeyedLoadIC <object> <slot> 638 // KeyedLoadIC <object> <slot>
633 // 639 //
634 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key 640 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key
635 // in the accumulator. 641 // in the accumulator.
636 void Interpreter::DoLdaKeyedProperty(InterpreterAssembler* assembler) { 642 void Interpreter::DoLdaKeyedProperty(InterpreterAssembler* assembler) {
637 Callable ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate_); 643 auto ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate_);
638 Node* result = BuildLoadKeyedProperty(ic, assembler); 644 typedef decltype(ic)::Descriptor Descriptor;
645 Node* result = BuildLoadKeyedProperty<Descriptor>(ic, assembler);
639 __ SetAccumulator(result); 646 __ SetAccumulator(result);
640 __ Dispatch(); 647 __ Dispatch();
641 } 648 }
642 649
643 // LdrKeyedProperty <object> <slot> <reg> 650 // LdrKeyedProperty <object> <slot> <reg>
644 // 651 //
645 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key 652 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key
646 // in the accumulator and puts the result in register <reg>. 653 // in the accumulator and puts the result in register <reg>.
647 void Interpreter::DoLdrKeyedProperty(InterpreterAssembler* assembler) { 654 void Interpreter::DoLdrKeyedProperty(InterpreterAssembler* assembler) {
648 Callable ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate_); 655 auto ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate_);
649 Node* result = BuildLoadKeyedProperty(ic, assembler); 656 typedef decltype(ic)::Descriptor Descriptor;
657 Node* result = BuildLoadKeyedProperty<Descriptor>(ic, assembler);
650 Node* destination = __ BytecodeOperandReg(2); 658 Node* destination = __ BytecodeOperandReg(2);
651 __ StoreRegister(result, destination); 659 __ StoreRegister(result, destination);
652 __ Dispatch(); 660 __ Dispatch();
653 } 661 }
654 662
663 template <typename Descriptor>
655 void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) { 664 void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) {
656 typedef StoreWithVectorDescriptor Descriptor;
657 Node* code_target = __ HeapConstant(ic.code()); 665 Node* code_target = __ HeapConstant(ic.code());
658 Node* object_reg_index = __ BytecodeOperandReg(0); 666 Node* object_reg_index = __ BytecodeOperandReg(0);
659 Node* object = __ LoadRegister(object_reg_index); 667 Node* object = __ LoadRegister(object_reg_index);
660 Node* constant_index = __ BytecodeOperandIdx(1); 668 Node* constant_index = __ BytecodeOperandIdx(1);
661 Node* name = __ LoadConstantPoolEntry(constant_index); 669 Node* name = __ LoadConstantPoolEntry(constant_index);
662 Node* value = __ GetAccumulator(); 670 Node* value = __ GetAccumulator();
663 Node* raw_slot = __ BytecodeOperandIdx(2); 671 Node* raw_slot = __ BytecodeOperandIdx(2);
664 Node* smi_slot = __ SmiTag(raw_slot); 672 Node* smi_slot = __ SmiTag(raw_slot);
665 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 673 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
666 Node* context = __ GetContext(); 674 Node* context = __ GetContext();
667 __ CallStub(ic.descriptor(), code_target, context, 675 __ CallStub(ic.descriptor(), code_target, context,
668 Arg(Descriptor::kReceiver, object), Arg(Descriptor::kName, name), 676 Arg(Descriptor::kReceiver, object), Arg(Descriptor::kName, name),
669 Arg(Descriptor::kValue, value), Arg(Descriptor::kSlot, smi_slot), 677 Arg(Descriptor::kValue, value), Arg(Descriptor::kSlot, smi_slot),
670 Arg(Descriptor::kVector, type_feedback_vector)); 678 Arg(Descriptor::kVector, type_feedback_vector));
671 __ Dispatch(); 679 __ Dispatch();
672 } 680 }
673 681
674 // StaNamedPropertySloppy <object> <name_index> <slot> 682 // StaNamedPropertySloppy <object> <name_index> <slot>
675 // 683 //
676 // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and 684 // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and
677 // the name in constant pool entry <name_index> with the value in the 685 // the name in constant pool entry <name_index> with the value in the
678 // accumulator. 686 // accumulator.
679 void Interpreter::DoStaNamedPropertySloppy(InterpreterAssembler* assembler) { 687 void Interpreter::DoStaNamedPropertySloppy(InterpreterAssembler* assembler) {
680 Callable ic = CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY); 688 auto ic = CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY);
681 DoStoreIC(ic, assembler); 689 typedef decltype(ic)::Descriptor Descriptor;
690 DoStoreIC<Descriptor>(ic, assembler);
682 } 691 }
683 692
684 // StaNamedPropertyStrict <object> <name_index> <slot> 693 // StaNamedPropertyStrict <object> <name_index> <slot>
685 // 694 //
686 // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and 695 // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and
687 // the name in constant pool entry <name_index> with the value in the 696 // the name in constant pool entry <name_index> with the value in the
688 // accumulator. 697 // accumulator.
689 void Interpreter::DoStaNamedPropertyStrict(InterpreterAssembler* assembler) { 698 void Interpreter::DoStaNamedPropertyStrict(InterpreterAssembler* assembler) {
690 Callable ic = CodeFactory::StoreICInOptimizedCode(isolate_, STRICT); 699 auto ic = CodeFactory::StoreICInOptimizedCode(isolate_, STRICT);
691 DoStoreIC(ic, assembler); 700 typedef decltype(ic)::Descriptor Descriptor;
701 DoStoreIC<Descriptor>(ic, assembler);
692 } 702 }
693 703
704 template <typename Descriptor>
694 void Interpreter::DoKeyedStoreIC(Callable ic, InterpreterAssembler* assembler) { 705 void Interpreter::DoKeyedStoreIC(Callable ic, InterpreterAssembler* assembler) {
695 typedef StoreWithVectorDescriptor Descriptor;
696 Node* code_target = __ HeapConstant(ic.code()); 706 Node* code_target = __ HeapConstant(ic.code());
697 Node* object_reg_index = __ BytecodeOperandReg(0); 707 Node* object_reg_index = __ BytecodeOperandReg(0);
698 Node* object = __ LoadRegister(object_reg_index); 708 Node* object = __ LoadRegister(object_reg_index);
699 Node* name_reg_index = __ BytecodeOperandReg(1); 709 Node* name_reg_index = __ BytecodeOperandReg(1);
700 Node* name = __ LoadRegister(name_reg_index); 710 Node* name = __ LoadRegister(name_reg_index);
701 Node* value = __ GetAccumulator(); 711 Node* value = __ GetAccumulator();
702 Node* raw_slot = __ BytecodeOperandIdx(2); 712 Node* raw_slot = __ BytecodeOperandIdx(2);
703 Node* smi_slot = __ SmiTag(raw_slot); 713 Node* smi_slot = __ SmiTag(raw_slot);
704 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 714 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
705 Node* context = __ GetContext(); 715 Node* context = __ GetContext();
706 __ CallStub(ic.descriptor(), code_target, context, 716 __ CallStub(ic.descriptor(), code_target, context,
707 Arg(Descriptor::kReceiver, object), Arg(Descriptor::kName, name), 717 Arg(Descriptor::kReceiver, object), Arg(Descriptor::kName, name),
708 Arg(Descriptor::kValue, value), Arg(Descriptor::kSlot, smi_slot), 718 Arg(Descriptor::kValue, value), Arg(Descriptor::kSlot, smi_slot),
709 Arg(Descriptor::kVector, type_feedback_vector)); 719 Arg(Descriptor::kVector, type_feedback_vector));
710 __ Dispatch(); 720 __ Dispatch();
711 } 721 }
712 722
713 // StaKeyedPropertySloppy <object> <key> <slot> 723 // StaKeyedPropertySloppy <object> <key> <slot>
714 // 724 //
715 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> 725 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object>
716 // and the key <key> with the value in the accumulator. 726 // and the key <key> with the value in the accumulator.
717 void Interpreter::DoStaKeyedPropertySloppy(InterpreterAssembler* assembler) { 727 void Interpreter::DoStaKeyedPropertySloppy(InterpreterAssembler* assembler) {
718 Callable ic = CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY); 728 auto ic = CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY);
719 DoKeyedStoreIC(ic, assembler); 729 typedef decltype(ic)::Descriptor Descriptor;
730 DoKeyedStoreIC<Descriptor>(ic, assembler);
720 } 731 }
721 732
722 // StaKeyedPropertyStrict <object> <key> <slot> 733 // StaKeyedPropertyStrict <object> <key> <slot>
723 // 734 //
724 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> 735 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object>
725 // and the key <key> with the value in the accumulator. 736 // and the key <key> with the value in the accumulator.
726 void Interpreter::DoStaKeyedPropertyStrict(InterpreterAssembler* assembler) { 737 void Interpreter::DoStaKeyedPropertyStrict(InterpreterAssembler* assembler) {
727 Callable ic = CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT); 738 auto ic = CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT);
728 DoKeyedStoreIC(ic, assembler); 739 typedef decltype(ic)::Descriptor Descriptor;
740 DoKeyedStoreIC<Descriptor>(ic, assembler);
729 } 741 }
730 742
731 // PushContext <context> 743 // PushContext <context>
732 // 744 //
733 // Saves the current context in <context>, and pushes the accumulator as the 745 // Saves the current context in <context>, and pushes the accumulator as the
734 // new current context. 746 // new current context.
735 void Interpreter::DoPushContext(InterpreterAssembler* assembler) { 747 void Interpreter::DoPushContext(InterpreterAssembler* assembler) {
736 Node* reg_index = __ BytecodeOperandReg(0); 748 Node* reg_index = __ BytecodeOperandReg(0);
737 Node* new_context = __ GetAccumulator(); 749 Node* new_context = __ GetAccumulator();
738 Node* old_context = __ GetContext(); 750 Node* old_context = __ GetContext();
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 Node* context = __ GetContext(); 1021 Node* context = __ GetContext();
1010 Node* lhs_value = __ TruncateTaggedToWord32(context, left); 1022 Node* lhs_value = __ TruncateTaggedToWord32(context, left);
1011 Node* rhs_value = __ SmiToWord32(right); 1023 Node* rhs_value = __ SmiToWord32(right);
1012 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); 1024 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f));
1013 Node* value = __ Word32Sar(lhs_value, shift_count); 1025 Node* value = __ Word32Sar(lhs_value, shift_count);
1014 Node* result = __ ChangeInt32ToTagged(value); 1026 Node* result = __ ChangeInt32ToTagged(value);
1015 __ SetAccumulator(result); 1027 __ SetAccumulator(result);
1016 __ Dispatch(); 1028 __ Dispatch();
1017 } 1029 }
1018 1030
1019 Node* Interpreter::BuildUnaryOp(Callable callable, 1031 Node* Interpreter::BuildUnaryOp(const Callable& callable,
1020 InterpreterAssembler* assembler) { 1032 InterpreterAssembler* assembler) {
1021 Node* target = __ HeapConstant(callable.code()); 1033 Node* target = __ HeapConstant(callable.code());
1022 Node* accumulator = __ GetAccumulator(); 1034 Node* accumulator = __ GetAccumulator();
1023 Node* context = __ GetContext(); 1035 Node* context = __ GetContext();
1024 return __ CallStub(callable.descriptor(), target, context, accumulator); 1036 return __ CallStub(callable.descriptor(), target, context, accumulator);
1025 } 1037 }
1026 1038
1027 void Interpreter::DoUnaryOp(Callable callable, 1039 void Interpreter::DoUnaryOp(const Callable& callable,
1028 InterpreterAssembler* assembler) { 1040 InterpreterAssembler* assembler) {
1029 Node* result = BuildUnaryOp(callable, assembler); 1041 Node* result = BuildUnaryOp(callable, assembler);
1030 __ SetAccumulator(result); 1042 __ SetAccumulator(result);
1031 __ Dispatch(); 1043 __ Dispatch();
1032 } 1044 }
1033 1045
1034 template <class Generator> 1046 template <class Generator>
1035 void Interpreter::DoUnaryOp(InterpreterAssembler* assembler) { 1047 void Interpreter::DoUnaryOp(InterpreterAssembler* assembler) {
1036 Node* value = __ GetAccumulator(); 1048 Node* value = __ GetAccumulator();
1037 Node* context = __ GetContext(); 1049 Node* context = __ GetContext();
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
2174 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, 2186 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset,
2175 __ SmiTag(new_state)); 2187 __ SmiTag(new_state));
2176 __ SetAccumulator(old_state); 2188 __ SetAccumulator(old_state);
2177 2189
2178 __ Dispatch(); 2190 __ Dispatch();
2179 } 2191 }
2180 2192
2181 } // namespace interpreter 2193 } // namespace interpreter
2182 } // namespace internal 2194 } // namespace internal
2183 } // namespace v8 2195 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/interpreter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698