Chromium Code Reviews| Index: src/interpreter/interpreter-assembler.cc |
| diff --git a/src/interpreter/interpreter-assembler.cc b/src/interpreter/interpreter-assembler.cc |
| index 66af04f5f0509c80888e9d1bcc97e609170ad0db..841b4f06f640b6d31e77f14cc56b57f3122c6258 100644 |
| --- a/src/interpreter/interpreter-assembler.cc |
| +++ b/src/interpreter/interpreter-assembler.cc |
| @@ -376,6 +376,17 @@ Node* InterpreterAssembler::LoadObjectField(Node* object, int offset) { |
| IntPtrConstant(offset - kHeapObjectTag)); |
| } |
| +Node* InterpreterAssembler::LoadObjectFieldInt32(Node* object, int offset) { |
| + return Load(MachineType::Int32(), object, |
| + IntPtrConstant(offset - kHeapObjectTag)); |
| +} |
| + |
| +Node* InterpreterAssembler::StoreObjectField(Node* object, int offset, |
| + Node* value) { |
| + return Store(MachineRepresentation::kTagged, object, |
| + IntPtrConstant(offset - kHeapObjectTag), value); |
| +} |
| + |
| Node* InterpreterAssembler::LoadContextSlot(Node* context, int slot_index) { |
| return Load(MachineType::AnyTagged(), context, |
| IntPtrConstant(Context::SlotOffset(slot_index))); |
| @@ -713,6 +724,74 @@ bool InterpreterAssembler::TargetSupportsUnalignedAccess() { |
| #endif |
| } |
| +Node* InterpreterAssembler::RegisterCount() { |
| + Node* bytecode_array = LoadRegister(Register::bytecode_array()); |
| + Node* frame_size = |
| + LoadObjectFieldInt32(bytecode_array, BytecodeArray::kFrameSizeOffset); |
| + return Word32Sar(frame_size, Int32Constant(kPointerSizeLog2)); |
| +} |
| + |
| +Node* InterpreterAssembler::ExportRegisterFile() { |
| + Node* register_count = RegisterCount(); |
| + Node* array = |
| + AllocateUninitializedFixedArray(ChangeInt32ToWord(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::kRegisterFileStartOffset), index); |
|
rmcilroy
2016/04/21 10:21:32
I'd prefer to keep kRegisterFileStartOffset privat
neis
2016/04/21 11:30:15
I don't want to change var_index because it's also
rmcilroy
2016/04/21 13:55:02
Works for me, thanks!
|
| + Node* value = LoadRegister(ChangeInt32ToWord(reg_index)); |
| + |
| + StoreFixedArrayElementNoWriteBarrier( |
|
rmcilroy
2016/04/21 10:21:32
I'm not sure NoWriteBarrier is correct here. The r
neis
2016/04/21 11:30:15
I was told that it's not needed since we are writi
rmcilroy
2016/04/21 13:55:02
That sounds plausible :). Please add a comment to
|
| + array, ChangeInt32ToWord(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::kRegisterFileStartOffset), index); |
| + StoreRegister(value, ChangeInt32ToWord(reg_index)); |
| + |
| + var_index.Bind(Int32Add(index, Int32Constant(1))); |
| + Goto(&loop); |
| + } |
| + Bind(&done_loop); |
| + |
| + return array; |
| +} |
| + |
| } // namespace interpreter |
| } // namespace internal |
| } // namespace v8 |