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

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

Issue 2894293003: Save/restore only live registers in the generator suspend/resume. (Closed)
Patch Set: Tweak Created 3 years, 6 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
OLDNEW
1 // Copyright 2017 the V8 project authors. All rights reserved. 1 // Copyright 2017 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-generator.h" 5 #include "src/interpreter/interpreter-generator.h"
6 6
7 #include <array> 7 #include <array>
8 #include <tuple> 8 #include <tuple>
9 9
10 #include "src/builtins/builtins-arguments-gen.h" 10 #include "src/builtins/builtins-arguments-gen.h"
(...skipping 3594 matching lines...) Expand 10 before | Expand all | Expand 10 after
3605 // Illegal 3605 // Illegal
3606 // 3606 //
3607 // An invalid bytecode aborting execution if dispatched. 3607 // An invalid bytecode aborting execution if dispatched.
3608 IGNITION_HANDLER(Illegal, InterpreterAssembler) { Abort(kInvalidBytecode); } 3608 IGNITION_HANDLER(Illegal, InterpreterAssembler) { Abort(kInvalidBytecode); }
3609 3609
3610 // Nop 3610 // Nop
3611 // 3611 //
3612 // No operation. 3612 // No operation.
3613 IGNITION_HANDLER(Nop, InterpreterAssembler) { Dispatch(); } 3613 IGNITION_HANDLER(Nop, InterpreterAssembler) { Dispatch(); }
3614 3614
3615 // SuspendGenerator <generator> 3615 // SuspendGenerator <generator> <first input register> <register count> <flags>
3616 // 3616 //
3617 // Exports the register file and stores it into the generator. Also stores the 3617 // Exports the register file and stores it into the generator. Also stores the
3618 // current context, the state given in the accumulator, and the current bytecode 3618 // current context, the state given in the accumulator, and the current bytecode
3619 // offset (for debugging purposes) into the generator. 3619 // offset (for debugging purposes) into the generator.
3620 IGNITION_HANDLER(SuspendGenerator, InterpreterAssembler) { 3620 IGNITION_HANDLER(SuspendGenerator, InterpreterAssembler) {
3621 Node* generator_reg = BytecodeOperandReg(0); 3621 Node* generator_reg = BytecodeOperandReg(0);
3622 Node* flags = BytecodeOperandFlag(1); 3622 Node* flags = BytecodeOperandFlag(3);
3623
3623 Node* generator = LoadRegister(generator_reg); 3624 Node* generator = LoadRegister(generator_reg);
3624 3625
3625 Label if_stepping(this, Label::kDeferred), ok(this); 3626 Label if_stepping(this, Label::kDeferred), ok(this);
3626 Node* step_action_address = ExternalConstant( 3627 Node* step_action_address = ExternalConstant(
3627 ExternalReference::debug_last_step_action_address(isolate())); 3628 ExternalReference::debug_last_step_action_address(isolate()));
3628 Node* step_action = Load(MachineType::Int8(), step_action_address); 3629 Node* step_action = Load(MachineType::Int8(), step_action_address);
3629 STATIC_ASSERT(StepIn > StepNext); 3630 STATIC_ASSERT(StepIn > StepNext);
3630 STATIC_ASSERT(LastStepAction == StepIn); 3631 STATIC_ASSERT(LastStepAction == StepIn);
3631 Node* step_next = Int32Constant(StepNext); 3632 Node* step_next = Int32Constant(StepNext);
3632 Branch(Int32LessThanOrEqual(step_next, step_action), &if_stepping, &ok); 3633 Branch(Int32LessThanOrEqual(step_next, step_action), &if_stepping, &ok);
3633 BIND(&ok); 3634 BIND(&ok);
3634 3635
3635 Node* array = 3636 Node* array =
3636 LoadObjectField(generator, JSGeneratorObject::kRegisterFileOffset); 3637 LoadObjectField(generator, JSGeneratorObject::kRegisterFileOffset);
3637 Node* context = GetContext(); 3638 Node* context = GetContext();
3638 Node* state = GetAccumulator(); 3639 Node* state = GetAccumulator();
3639 3640
3640 ExportRegisterFile(array); 3641 // Bytecode operand 1 should be always 0 (we are always store registers
3642 // from the beginning).
3643 CSA_ASSERT(this, WordEqual(BytecodeOperandReg(1),
3644 IntPtrConstant(Register(0).ToOperand())));
3645 // Bytecode operand 2 is the number of registers to store to the generator.
3646 Node* register_count = ChangeUint32ToWord(BytecodeOperandCount(2));
3647 ExportRegisterFile(array, register_count);
3641 StoreObjectField(generator, JSGeneratorObject::kContextOffset, context); 3648 StoreObjectField(generator, JSGeneratorObject::kContextOffset, context);
3642 StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, state); 3649 StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, state);
3643 3650
3644 Label if_asyncgeneratorawait(this), if_notasyncgeneratorawait(this), 3651 Label if_asyncgeneratorawait(this), if_notasyncgeneratorawait(this),
3645 merge(this); 3652 merge(this);
3646 3653
3647 // Calculate bytecode offset to store in the [input_or_debug_pos] or 3654 // Calculate bytecode offset to store in the [input_or_debug_pos] or
3648 // [await_input_or_debug_pos] fields, to be used by the inspector. 3655 // [await_input_or_debug_pos] fields, to be used by the inspector.
3649 Node* offset = SmiTag(BytecodeOffset()); 3656 Node* offset = SmiTag(BytecodeOffset());
3650 3657
(...skipping 28 matching lines...) Expand all
3679 Dispatch(); 3686 Dispatch();
3680 3687
3681 BIND(&if_stepping); 3688 BIND(&if_stepping);
3682 { 3689 {
3683 Node* context = GetContext(); 3690 Node* context = GetContext();
3684 CallRuntime(Runtime::kDebugRecordGenerator, context, generator); 3691 CallRuntime(Runtime::kDebugRecordGenerator, context, generator);
3685 Goto(&ok); 3692 Goto(&ok);
3686 } 3693 }
3687 } 3694 }
3688 3695
3689 // ResumeGenerator <generator> 3696 // RestoreGeneratorState <generator>
3690 // 3697 //
3691 // Imports the register file stored in the generator. Also loads the 3698 // Loads the generator's state and stores it in the accumulator,
3692 // generator's state and stores it in the accumulator, before overwriting it 3699 // before overwriting it with kGeneratorExecuting.
3693 // with kGeneratorExecuting. 3700 IGNITION_HANDLER(RestoreGeneratorState, InterpreterAssembler) {
3694 IGNITION_HANDLER(ResumeGenerator, InterpreterAssembler) {
3695 Node* generator_reg = BytecodeOperandReg(0); 3701 Node* generator_reg = BytecodeOperandReg(0);
3696 Node* generator = LoadRegister(generator_reg); 3702 Node* generator = LoadRegister(generator_reg);
3697 3703
3698 ImportRegisterFile(
3699 LoadObjectField(generator, JSGeneratorObject::kRegisterFileOffset));
3700
3701 Node* old_state = 3704 Node* old_state =
3702 LoadObjectField(generator, JSGeneratorObject::kContinuationOffset); 3705 LoadObjectField(generator, JSGeneratorObject::kContinuationOffset);
3703 Node* new_state = Int32Constant(JSGeneratorObject::kGeneratorExecuting); 3706 Node* new_state = Int32Constant(JSGeneratorObject::kGeneratorExecuting);
3704 StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, 3707 StoreObjectField(generator, JSGeneratorObject::kContinuationOffset,
3705 SmiTag(new_state)); 3708 SmiTag(new_state));
3706 SetAccumulator(old_state); 3709 SetAccumulator(old_state);
3707 3710
3708 Dispatch(); 3711 Dispatch();
3709 } 3712 }
3710 3713
3714 // RestoreGeneratorRegisters <generator> <first output register> <register
3715 // count>
3716 //
3717 // Imports the register file stored in the generator.
3718 IGNITION_HANDLER(RestoreGeneratorRegisters, InterpreterAssembler) {
3719 Node* generator_reg = BytecodeOperandReg(0);
3720 // Bytecode operand 1 is the start register. It should always be 0, so let's
3721 // ignore it.
3722 CSA_ASSERT(this, WordEqual(BytecodeOperandReg(1),
3723 IntPtrConstant(Register(0).ToOperand())));
3724 // Bytecode operand 2 is the number of registers to store to the generator.
3725 Node* register_count = ChangeUint32ToWord(BytecodeOperandCount(2));
3726
3727 Node* generator = LoadRegister(generator_reg);
3728
3729 ImportRegisterFile(
3730 LoadObjectField(generator, JSGeneratorObject::kRegisterFileOffset),
3731 register_count);
3732
3733 Dispatch();
3734 }
3735
3711 } // namespace 3736 } // namespace
3712 3737
3713 Handle<Code> GenerateBytecodeHandler(Isolate* isolate, Bytecode bytecode, 3738 Handle<Code> GenerateBytecodeHandler(Isolate* isolate, Bytecode bytecode,
3714 OperandScale operand_scale) { 3739 OperandScale operand_scale) {
3715 Zone zone(isolate->allocator(), ZONE_NAME); 3740 Zone zone(isolate->allocator(), ZONE_NAME);
3716 InterpreterDispatchDescriptor descriptor(isolate); 3741 InterpreterDispatchDescriptor descriptor(isolate);
3717 compiler::CodeAssemblerState state( 3742 compiler::CodeAssemblerState state(
3718 isolate, &zone, descriptor, Code::ComputeFlags(Code::BYTECODE_HANDLER), 3743 isolate, &zone, descriptor, Code::ComputeFlags(Code::BYTECODE_HANDLER),
3719 Bytecodes::ToString(bytecode), Bytecodes::ReturnCount(bytecode)); 3744 Bytecodes::ToString(bytecode), Bytecodes::ReturnCount(bytecode));
3720 3745
(...skipping 17 matching lines...) Expand all
3738 code->Disassemble(Bytecodes::ToString(bytecode), os); 3763 code->Disassemble(Bytecodes::ToString(bytecode), os);
3739 os << std::flush; 3764 os << std::flush;
3740 } 3765 }
3741 #endif // ENABLE_DISASSEMBLER 3766 #endif // ENABLE_DISASSEMBLER
3742 return code; 3767 return code;
3743 } 3768 }
3744 3769
3745 } // namespace interpreter 3770 } // namespace interpreter
3746 } // namespace internal 3771 } // namespace internal
3747 } // namespace v8 3772 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/interpreter-assembler.cc ('k') | test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698