| Index: src/interpreter/interpreter-assembler.cc
|
| diff --git a/src/interpreter/interpreter-assembler.cc b/src/interpreter/interpreter-assembler.cc
|
| index 66af04f5f0509c80888e9d1bcc97e609170ad0db..ff935d6ad61bd8f02037085e533e61cb7de01bf6 100644
|
| --- a/src/interpreter/interpreter-assembler.cc
|
| +++ b/src/interpreter/interpreter-assembler.cc
|
| @@ -371,11 +371,6 @@ Node* InterpreterAssembler::LoadConstantPoolEntry(Node* index) {
|
| return Load(MachineType::AnyTagged(), constant_pool, entry_offset);
|
| }
|
|
|
| -Node* InterpreterAssembler::LoadObjectField(Node* object, int offset) {
|
| - return Load(MachineType::AnyTagged(), object,
|
| - IntPtrConstant(offset - kHeapObjectTag));
|
| -}
|
| -
|
| Node* InterpreterAssembler::LoadContextSlot(Node* context, int slot_index) {
|
| return Load(MachineType::AnyTagged(), context,
|
| IntPtrConstant(Context::SlotOffset(slot_index)));
|
| @@ -713,6 +708,75 @@ bool InterpreterAssembler::TargetSupportsUnalignedAccess() {
|
| #endif
|
| }
|
|
|
| +Node* InterpreterAssembler::RegisterCount() {
|
| + Node* bytecode_array = LoadRegister(Register::bytecode_array());
|
| + Node* frame_size = LoadObjectField(
|
| + bytecode_array, BytecodeArray::kFrameSizeOffset, MachineType::Int32());
|
| + return Word32Sar(frame_size, Int32Constant(kPointerSizeLog2));
|
| +}
|
| +
|
| +Node* InterpreterAssembler::ExportRegisterFile() {
|
| + Node* register_count = RegisterCount();
|
| + Node* array =
|
| + AllocateUninitializedFixedArray(ChangeInt32ToIntPtr(register_count));
|
| +
|
| + Variable var_index(this, MachineRepresentation::kWord32);
|
| + var_index.Bind(Int32Constant(0));
|
| +
|
| + // Iterate over register file and write values into array.
|
| + Label loop(this, &var_index), done_loop(this);
|
| + Goto(&loop);
|
| + Bind(&loop);
|
| + {
|
| + Node* index = var_index.value();
|
| + Node* condition = Int32LessThan(index, register_count);
|
| + GotoUnless(condition, &done_loop);
|
| +
|
| + Node* reg_index =
|
| + Int32Sub(Int32Constant(Register(0).ToOperand()), index);
|
| + Node* value = LoadRegister(ChangeInt32ToIntPtr(reg_index));
|
| +
|
| + // No write barrier needed for writing into freshly allocated object.
|
| + StoreFixedArrayElementNoWriteBarrier(
|
| + array, ChangeInt32ToIntPtr(index), value);
|
| +
|
| + var_index.Bind(Int32Add(index, Int32Constant(1)));
|
| + Goto(&loop);
|
| + }
|
| + Bind(&done_loop);
|
| +
|
| + return array;
|
| +}
|
| +
|
| +Node* InterpreterAssembler::ImportRegisterFile(Node* array) {
|
| + Node* register_count = RegisterCount();
|
| +
|
| + Variable var_index(this, MachineRepresentation::kWord32);
|
| + var_index.Bind(Int32Constant(0));
|
| +
|
| + // Iterate over array and write values into register file.
|
| + Label loop(this, &var_index), done_loop(this);
|
| + Goto(&loop);
|
| + Bind(&loop);
|
| + {
|
| + Node* index = var_index.value();
|
| + Node* condition = Int32LessThan(index, register_count);
|
| + GotoUnless(condition, &done_loop);
|
| +
|
| + Node* value = LoadFixedArrayElementInt32Index(array, index);
|
| +
|
| + Node* reg_index =
|
| + Int32Sub(Int32Constant(Register(0).ToOperand()), index);
|
| + StoreRegister(value, ChangeInt32ToIntPtr(reg_index));
|
| +
|
| + var_index.Bind(Int32Add(index, Int32Constant(1)));
|
| + Goto(&loop);
|
| + }
|
| + Bind(&done_loop);
|
| +
|
| + return array;
|
| +}
|
| +
|
| } // namespace interpreter
|
| } // namespace internal
|
| } // namespace v8
|
|
|