| Index: src/interpreter/bytecode-register-optimizer.h
|
| diff --git a/src/interpreter/bytecode-register-optimizer.h b/src/interpreter/bytecode-register-optimizer.h
|
| index b5e326c3718e675a26e92c21cc44d0db68e1e3f6..885f10f3441e9159c5a6a24063d0de5480adfdcb 100644
|
| --- a/src/interpreter/bytecode-register-optimizer.h
|
| +++ b/src/interpreter/bytecode-register-optimizer.h
|
| @@ -18,8 +18,7 @@ namespace interpreter {
|
| // liberally for correctness and convenience and this stage removes
|
| // transfers that are not required and preserves correctness.
|
| class V8_EXPORT_PRIVATE BytecodeRegisterOptimizer final
|
| - : public NON_EXPORTED_BASE(BytecodePipelineStage),
|
| - public NON_EXPORTED_BASE(BytecodeRegisterAllocator::Observer),
|
| + : public NON_EXPORTED_BASE(BytecodeRegisterAllocator::Observer),
|
| public NON_EXPORTED_BASE(ZoneObject) {
|
| public:
|
| BytecodeRegisterOptimizer(Zone* zone,
|
| @@ -28,14 +27,41 @@ class V8_EXPORT_PRIVATE BytecodeRegisterOptimizer final
|
| BytecodePipelineStage* next_stage);
|
| virtual ~BytecodeRegisterOptimizer() {}
|
|
|
| - // BytecodePipelineStage interface.
|
| - void Write(BytecodeNode* node) override;
|
| - void WriteJump(BytecodeNode* node, BytecodeLabel* label) override;
|
| - void BindLabel(BytecodeLabel* label) override;
|
| - void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override;
|
| - Handle<BytecodeArray> ToBytecodeArray(
|
| - Isolate* isolate, int register_count, int parameter_count,
|
| - Handle<FixedArray> handler_table) override;
|
| + // Perform explicit register transfer operations.
|
| + void DoLdar(Register input, BytecodeSourceInfo source_info) {
|
| + RegisterInfo* input_info = GetRegisterInfo(input);
|
| + RegisterTransfer(input_info, accumulator_info_, source_info);
|
| + }
|
| + void DoStar(Register output, BytecodeSourceInfo source_info) {
|
| + RegisterInfo* output_info = GetRegisterInfo(output);
|
| + RegisterTransfer(accumulator_info_, output_info, source_info);
|
| + }
|
| + void DoMov(Register input, Register output, BytecodeSourceInfo source_info) {
|
| + RegisterInfo* input_info = GetRegisterInfo(input);
|
| + RegisterInfo* output_info = GetRegisterInfo(output);
|
| + RegisterTransfer(input_info, output_info, source_info);
|
| + }
|
| +
|
| + // Materialize all live registers and flush equivalence sets.
|
| + void Flush();
|
| +
|
| + // Prepares for |bytecode|.
|
| + void PrepareForBytecode(Bytecode bytecode);
|
| +
|
| + // Prepares |reg| for being used as an output operand.
|
| + void PrepareOutputRegister(Register reg);
|
| +
|
| + // Prepares registers in |reg_list| for being used as an output operand.
|
| + void PrepareOutputRegisterList(RegisterList reg_list);
|
| +
|
| + // Returns an equivalent register to |reg| to be used as an input operand.
|
| + Register GetInputRegister(Register reg);
|
| +
|
| + // Returns an equivalent register list to |reg_list| to be used as an input
|
| + // operand.
|
| + RegisterList GetInputRegisterList(RegisterList reg_list);
|
| +
|
| + int maxiumum_register_index() const { return max_register_index_; }
|
|
|
| private:
|
| static const uint32_t kInvalidEquivalenceId;
|
| @@ -47,48 +73,20 @@ class V8_EXPORT_PRIVATE BytecodeRegisterOptimizer final
|
| void RegisterListAllocateEvent(RegisterList reg_list) override;
|
| void RegisterListFreeEvent(RegisterList reg) override;
|
|
|
| - // Helpers for BytecodePipelineStage interface.
|
| - void FlushState();
|
| -
|
| // Update internal state for register transfer from |input| to
|
| // |output| using |source_info| as source position information if
|
| // any bytecodes are emitted due to transfer.
|
| void RegisterTransfer(RegisterInfo* input, RegisterInfo* output,
|
| - BytecodeSourceInfo* source_info);
|
| + BytecodeSourceInfo source_info);
|
|
|
| // Emit a register transfer bytecode from |input| to |output|.
|
| - void OutputRegisterTransfer(RegisterInfo* input, RegisterInfo* output,
|
| - BytecodeSourceInfo* source_info = nullptr);
|
| + void OutputRegisterTransfer(
|
| + RegisterInfo* input, RegisterInfo* output,
|
| + BytecodeSourceInfo source_info = BytecodeSourceInfo());
|
|
|
| // Emits a Nop to preserve source position information in the
|
| // bytecode pipeline.
|
| - void EmitNopForSourceInfo(BytecodeSourceInfo* source_info) const;
|
| -
|
| - // Handlers for bytecode nodes for register to register transfers.
|
| - void DoLdar(BytecodeNode* node);
|
| - void DoMov(BytecodeNode* node);
|
| - void DoStar(BytecodeNode* node);
|
| -
|
| - // Operand processing methods for bytecodes other than those
|
| - // performing register to register transfers.
|
| - void PrepareOperands(BytecodeNode* const node);
|
| - void PrepareAccumulator(BytecodeNode* const node);
|
| - void PrepareRegisterOperands(BytecodeNode* const node);
|
| -
|
| - void PrepareRegisterOutputOperand(RegisterInfo* reg_info);
|
| - void PrepareRegisterRangeOutputOperand(Register start, int count);
|
| - void PrepareRegisterInputOperand(BytecodeNode* const node, Register reg,
|
| - int operand_index);
|
| - void PrepareRegisterRangeInputOperand(Register start, int count);
|
| -
|
| - Register GetEquivalentRegisterForInputOperand(Register reg);
|
| -
|
| - static Register GetRegisterInputOperand(int index, Bytecode bytecode,
|
| - const uint32_t* operands,
|
| - int operand_count);
|
| - static Register GetRegisterOutputOperand(int index, Bytecode bytecode,
|
| - const uint32_t* operands,
|
| - int operand_count);
|
| + void EmitNopForSourceInfo(BytecodeSourceInfo source_info) const;
|
|
|
| void CreateMaterializedEquivalent(RegisterInfo* info);
|
| RegisterInfo* GetMaterializedEquivalent(RegisterInfo* info);
|
| @@ -98,9 +96,23 @@ class V8_EXPORT_PRIVATE BytecodeRegisterOptimizer final
|
| RegisterInfo* non_set_member);
|
|
|
| // Methods for finding and creating metadata for each register.
|
| - RegisterInfo* GetOrCreateRegisterInfo(Register reg);
|
| - RegisterInfo* GetRegisterInfo(Register reg);
|
| - RegisterInfo* NewRegisterInfo(Register reg);
|
| + RegisterInfo* GetRegisterInfo(Register reg) {
|
| + size_t index = GetRegisterInfoTableIndex(reg);
|
| + DCHECK_LT(index, register_info_table_.size());
|
| + return register_info_table_[index];
|
| + }
|
| + RegisterInfo* GetOrCreateRegisterInfo(Register reg) {
|
| + size_t index = GetRegisterInfoTableIndex(reg);
|
| + return index < register_info_table_.size() ? register_info_table_[index]
|
| + : NewRegisterInfo(reg);
|
| + }
|
| + RegisterInfo* NewRegisterInfo(Register reg) {
|
| + size_t index = GetRegisterInfoTableIndex(reg);
|
| + DCHECK_GE(index, register_info_table_.size());
|
| + GrowRegisterMap(reg);
|
| + return register_info_table_[index];
|
| + }
|
| +
|
| void GrowRegisterMap(Register reg);
|
|
|
| bool RegisterIsTemporary(Register reg) const {
|
|
|