Chromium Code Reviews| OLD | NEW |
|---|---|
| 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-assembler.h" | 5 #include "src/interpreter/interpreter-assembler.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <ostream> | 8 #include <ostream> |
| 9 | 9 |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 708 #endif | 708 #endif |
| 709 } | 709 } |
| 710 | 710 |
| 711 Node* InterpreterAssembler::RegisterCount() { | 711 Node* InterpreterAssembler::RegisterCount() { |
| 712 Node* bytecode_array = LoadRegister(Register::bytecode_array()); | 712 Node* bytecode_array = LoadRegister(Register::bytecode_array()); |
| 713 Node* frame_size = LoadObjectField( | 713 Node* frame_size = LoadObjectField( |
| 714 bytecode_array, BytecodeArray::kFrameSizeOffset, MachineType::Int32()); | 714 bytecode_array, BytecodeArray::kFrameSizeOffset, MachineType::Int32()); |
| 715 return Word32Sar(frame_size, Int32Constant(kPointerSizeLog2)); | 715 return Word32Sar(frame_size, Int32Constant(kPointerSizeLog2)); |
| 716 } | 716 } |
| 717 | 717 |
| 718 Node* InterpreterAssembler::ExportRegisterFile() { | 718 Node* InterpreterAssembler::ExportRegisterFile(Node* array) { |
| 719 Node* register_count = RegisterCount(); | |
| 720 Node* array = | |
| 721 AllocateUninitializedFixedArray(ChangeInt32ToIntPtr(register_count)); | |
| 722 | |
| 723 Variable var_index(this, MachineRepresentation::kWord32); | 719 Variable var_index(this, MachineRepresentation::kWord32); |
| 724 var_index.Bind(Int32Constant(0)); | 720 var_index.Bind(Int32Constant(0)); |
| 725 | 721 |
|
rmcilroy
2016/04/28 11:40:57
Maybe we could add if (FLAG_debug_code) which chec
neis
2016/04/28 11:47:21
Acknowledged. But why this flag rather than a DCHE
neis
2016/04/28 12:05:25
Nevermind, I got it.
| |
| 726 // Iterate over register file and write values into array. | 722 // Iterate over register file and write values into array. |
| 727 Label loop(this, &var_index), done_loop(this); | 723 Label loop(this, &var_index), done_loop(this); |
| 728 Goto(&loop); | 724 Goto(&loop); |
| 729 Bind(&loop); | 725 Bind(&loop); |
| 730 { | 726 { |
| 731 Node* index = var_index.value(); | 727 Node* index = var_index.value(); |
| 732 Node* condition = Int32LessThan(index, register_count); | 728 Node* condition = Int32LessThan(index, RegisterCount()); |
| 733 GotoUnless(condition, &done_loop); | 729 GotoUnless(condition, &done_loop); |
| 734 | 730 |
| 735 Node* reg_index = | 731 Node* reg_index = |
| 736 Int32Sub(Int32Constant(Register(0).ToOperand()), index); | 732 Int32Sub(Int32Constant(Register(0).ToOperand()), index); |
| 737 Node* value = LoadRegister(ChangeInt32ToIntPtr(reg_index)); | 733 Node* value = LoadRegister(ChangeInt32ToIntPtr(reg_index)); |
| 738 | 734 |
| 739 // No write barrier needed for writing into freshly allocated object. | 735 // No write barrier needed for writing into freshly allocated object. |
|
rmcilroy
2016/04/28 11:40:57
This is no longer the case, I guess we need a writ
neis
2016/04/28 11:47:21
Good catch :)
| |
| 740 StoreFixedArrayElementNoWriteBarrier( | 736 StoreFixedArrayElementNoWriteBarrier( |
| 741 array, ChangeInt32ToIntPtr(index), value); | 737 array, ChangeInt32ToIntPtr(index), value); |
| 742 | 738 |
| 743 var_index.Bind(Int32Add(index, Int32Constant(1))); | 739 var_index.Bind(Int32Add(index, Int32Constant(1))); |
| 744 Goto(&loop); | 740 Goto(&loop); |
| 745 } | 741 } |
| 746 Bind(&done_loop); | 742 Bind(&done_loop); |
| 747 | 743 |
| 748 return array; | 744 return array; |
| 749 } | 745 } |
| 750 | 746 |
| 751 Node* InterpreterAssembler::ImportRegisterFile(Node* array) { | 747 Node* InterpreterAssembler::ImportRegisterFile(Node* array) { |
| 752 Node* register_count = RegisterCount(); | |
| 753 | |
| 754 Variable var_index(this, MachineRepresentation::kWord32); | 748 Variable var_index(this, MachineRepresentation::kWord32); |
| 755 var_index.Bind(Int32Constant(0)); | 749 var_index.Bind(Int32Constant(0)); |
| 756 | 750 |
|
rmcilroy
2016/04/28 11:40:57
ditto
neis
2016/04/28 11:47:21
Acknowledged.
| |
| 757 // Iterate over array and write values into register file. | 751 // Iterate over array and write values into register file. Also erase the |
| 752 // array contents to not keep them alive artificially. | |
| 758 Label loop(this, &var_index), done_loop(this); | 753 Label loop(this, &var_index), done_loop(this); |
| 759 Goto(&loop); | 754 Goto(&loop); |
| 760 Bind(&loop); | 755 Bind(&loop); |
| 761 { | 756 { |
| 762 Node* index = var_index.value(); | 757 Node* index = var_index.value(); |
| 763 Node* condition = Int32LessThan(index, register_count); | 758 Node* condition = Int32LessThan(index, RegisterCount()); |
| 764 GotoUnless(condition, &done_loop); | 759 GotoUnless(condition, &done_loop); |
| 765 | 760 |
| 766 Node* value = LoadFixedArrayElementInt32Index(array, index); | 761 Node* value = LoadFixedArrayElementInt32Index(array, index); |
| 767 | 762 |
| 768 Node* reg_index = | 763 Node* reg_index = |
| 769 Int32Sub(Int32Constant(Register(0).ToOperand()), index); | 764 Int32Sub(Int32Constant(Register(0).ToOperand()), index); |
| 770 StoreRegister(value, ChangeInt32ToIntPtr(reg_index)); | 765 StoreRegister(value, ChangeInt32ToIntPtr(reg_index)); |
| 771 | 766 |
| 767 StoreFixedArrayElementInt32Index(array, index, StaleRegisterConstant()); | |
| 768 | |
| 772 var_index.Bind(Int32Add(index, Int32Constant(1))); | 769 var_index.Bind(Int32Add(index, Int32Constant(1))); |
| 773 Goto(&loop); | 770 Goto(&loop); |
| 774 } | 771 } |
| 775 Bind(&done_loop); | 772 Bind(&done_loop); |
| 776 | 773 |
| 777 return array; | 774 return array; |
| 778 } | 775 } |
| 779 | 776 |
| 780 } // namespace interpreter | 777 } // namespace interpreter |
| 781 } // namespace internal | 778 } // namespace internal |
| 782 } // namespace v8 | 779 } // namespace v8 |
| OLD | NEW |