1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// found in the LICENSE file. 4bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 5bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifndef V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_ 6bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_ 7bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 8c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/base/compiler-specific.h" 9c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/globals.h" 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/interpreter/bytecode-peephole-table.h" 11bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/interpreter/bytecode-pipeline.h" 12bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 13bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochnamespace v8 { 14bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochnamespace internal { 15bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochnamespace interpreter { 16bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass BytecodePeepholeActionAndData; 18bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 19bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// An optimization stage for performing peephole optimizations on 20bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// generated bytecode. The optimizer may buffer one bytecode 21bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// internally. 22c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE BytecodePeepholeOptimizer final 23c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch : public NON_EXPORTED_BASE(BytecodePipelineStage), 24c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public NON_EXPORTED_BASE(ZoneObject) { 25bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public: 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit BytecodePeepholeOptimizer(BytecodePipelineStage* next_stage); 27bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 2813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // BytecodePipelineStage interface. 29bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void Write(BytecodeNode* node) override; 3013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void WriteJump(BytecodeNode* node, BytecodeLabel* label) override; 3113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void BindLabel(BytecodeLabel* label) override; 3213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override; 3313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<BytecodeArray> ToBytecodeArray( 34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Isolate* isolate, int register_count, int parameter_count, 3513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<FixedArray> handler_table) override; 36bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 37bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch private: 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define DECLARE_ACTION(Action) \ 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void Action(BytecodeNode* const node, \ 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const PeepholeActionAndData* const action_data = nullptr); 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PEEPHOLE_ACTION_LIST(DECLARE_ACTION) 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef DECLARE_ACTION 43bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void ApplyPeepholeAction(BytecodeNode* const node); 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void Flush(); 4613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool CanElideLastBasedOnSourcePosition( 4713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const BytecodeNode* const current) const; 48bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void InvalidateLast(); 49bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool LastIsValid() const; 50bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void SetLast(const BytecodeNode* const node); 51bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch BytecodePipelineStage* next_stage() const { return next_stage_; } 53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch BytecodeNode* last() { return &last_; } 54bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 55bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch BytecodePipelineStage* next_stage_; 56bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch BytecodeNode last_; 57bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 58bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BytecodePeepholeOptimizer); 59bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}; 60bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 61bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} // namespace interpreter 62bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} // namespace internal 63bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} // namespace v8 64bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 65bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif // V8_INTERPRETER_BYTECODE_PEEPHOLE_OPTIMIZER_H_ 66