1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_COMPILER_JS_GENERIC_LOWERING_H_ 6 #define V8_COMPILER_JS_GENERIC_LOWERING_H_ 7 8 #include "src/code-factory.h" 9 #include "src/compiler/graph-reducer.h" 10 #include "src/compiler/linkage.h" 11 #include "src/compiler/opcodes.h" 12 13 namespace v8 { 14 namespace internal { 15 namespace compiler { 16 17 // Forward declarations. 18 class CommonOperatorBuilder; 19 class JSGraph; 20 class MachineOperatorBuilder; 21 class Linkage; 22 23 24 // Lowers JS-level operators to runtime and IC calls in the "generic" case. 25 class JSGenericLowering final : public Reducer { 26 public: 27 explicit JSGenericLowering(JSGraph* jsgraph); 28 ~JSGenericLowering() final; 29 30 Reduction Reduce(Node* node) final; 31 32 protected: 33 #define DECLARE_LOWER(x) void Lower##x(Node* node); 34 // Dispatched depending on opcode. 35 JS_OP_LIST(DECLARE_LOWER) 36 #undef DECLARE_LOWER 37 38 // Helpers to replace existing nodes with a generic call. 39 void ReplaceWithStubCall(Node* node, Callable c, CallDescriptor::Flags flags); 40 void ReplaceWithStubCall(Node* node, Callable c, CallDescriptor::Flags flags, 41 Operator::Properties properties, 42 int result_size = 1); 43 void ReplaceWithRuntimeCall(Node* node, Runtime::FunctionId f, int args = -1); 44 45 Zone* zone() const; 46 Isolate* isolate() const; 47 JSGraph* jsgraph() const { return jsgraph_; } 48 Graph* graph() const; 49 CommonOperatorBuilder* common() const; 50 MachineOperatorBuilder* machine() const; 51 52 private: 53 JSGraph* const jsgraph_; 54 }; 55 56 } // namespace compiler 57 } // namespace internal 58 } // namespace v8 59 60 #endif // V8_COMPILER_JS_GENERIC_LOWERING_H_ 61