Home | History | Annotate | Download | only in compiler
      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_TYPED_LOWERING_H_
      6 #define V8_COMPILER_JS_TYPED_LOWERING_H_
      7 
      8 #include "src/base/compiler-specific.h"
      9 #include "src/compiler/graph-reducer.h"
     10 #include "src/compiler/opcodes.h"
     11 #include "src/globals.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 
     16 // Forward declarations.
     17 class Factory;
     18 
     19 namespace compiler {
     20 
     21 // Forward declarations.
     22 class CommonOperatorBuilder;
     23 class JSGraph;
     24 class JSOperatorBuilder;
     25 class SimplifiedOperatorBuilder;
     26 class TypeCache;
     27 
     28 enum Signedness { kSigned, kUnsigned };
     29 
     30 // Lowers JS-level operators to simplified operators based on types.
     31 class V8_EXPORT_PRIVATE JSTypedLowering final
     32     : public NON_EXPORTED_BASE(AdvancedReducer) {
     33  public:
     34   JSTypedLowering(Editor* editor, JSGraph* jsgraph,
     35                   JSHeapBroker* js_heap_broker, Zone* zone);
     36   ~JSTypedLowering() final {}
     37 
     38   const char* reducer_name() const override { return "JSTypedLowering"; }
     39 
     40   Reduction Reduce(Node* node) final;
     41 
     42  private:
     43   friend class JSBinopReduction;
     44 
     45   Reduction ReduceJSAdd(Node* node);
     46   Reduction ReduceJSBitwiseNot(Node* node);
     47   Reduction ReduceJSDecrement(Node* node);
     48   Reduction ReduceJSIncrement(Node* node);
     49   Reduction ReduceJSNegate(Node* node);
     50   Reduction ReduceJSComparison(Node* node);
     51   Reduction ReduceJSLoadNamed(Node* node);
     52   Reduction ReduceJSHasInPrototypeChain(Node* node);
     53   Reduction ReduceJSOrdinaryHasInstance(Node* node);
     54   Reduction ReduceJSLoadContext(Node* node);
     55   Reduction ReduceJSStoreContext(Node* node);
     56   Reduction ReduceJSLoadModule(Node* node);
     57   Reduction ReduceJSStoreModule(Node* node);
     58   Reduction ReduceJSEqual(Node* node);
     59   Reduction ReduceJSStrictEqual(Node* node);
     60   Reduction ReduceJSToInteger(Node* node);
     61   Reduction ReduceJSToLength(Node* node);
     62   Reduction ReduceJSToName(Node* node);
     63   Reduction ReduceJSToNumberOrNumericInput(Node* input);
     64   Reduction ReduceJSToNumberOrNumeric(Node* node);
     65   Reduction ReduceJSToStringInput(Node* input);
     66   Reduction ReduceJSToString(Node* node);
     67   Reduction ReduceJSToObject(Node* node);
     68   Reduction ReduceJSConstructForwardVarargs(Node* node);
     69   Reduction ReduceJSConstruct(Node* node);
     70   Reduction ReduceJSCallForwardVarargs(Node* node);
     71   Reduction ReduceJSCall(Node* node);
     72   Reduction ReduceJSForInNext(Node* node);
     73   Reduction ReduceJSForInPrepare(Node* node);
     74   Reduction ReduceJSLoadMessage(Node* node);
     75   Reduction ReduceJSStoreMessage(Node* node);
     76   Reduction ReduceJSGeneratorStore(Node* node);
     77   Reduction ReduceJSGeneratorRestoreContinuation(Node* node);
     78   Reduction ReduceJSGeneratorRestoreContext(Node* node);
     79   Reduction ReduceJSGeneratorRestoreRegister(Node* node);
     80   Reduction ReduceJSGeneratorRestoreInputOrDebugPos(Node* node);
     81   Reduction ReduceNumberBinop(Node* node);
     82   Reduction ReduceInt32Binop(Node* node);
     83   Reduction ReduceUI32Shift(Node* node, Signedness signedness);
     84   Reduction ReduceCreateConsString(Node* node);
     85   Reduction ReduceSpeculativeNumberAdd(Node* node);
     86   Reduction ReduceSpeculativeNumberMultiply(Node* node);
     87   Reduction ReduceSpeculativeNumberBinop(Node* node);
     88   Reduction ReduceSpeculativeNumberComparison(Node* node);
     89   Reduction ReduceObjectIsArray(Node* node);
     90   Reduction ReduceJSParseInt(Node* node);
     91 
     92   // Helper for ReduceJSLoadModule and ReduceJSStoreModule.
     93   Node* BuildGetModuleCell(Node* node);
     94 
     95   // Helpers for ReduceJSCreateConsString.
     96   Node* BuildGetStringLength(Node* value);
     97 
     98   Factory* factory() const;
     99   Graph* graph() const;
    100   JSGraph* jsgraph() const { return jsgraph_; }
    101   JSHeapBroker* js_heap_broker() const { return js_heap_broker_; }
    102   Isolate* isolate() const;
    103   JSOperatorBuilder* javascript() const;
    104   CommonOperatorBuilder* common() const;
    105   SimplifiedOperatorBuilder* simplified() const;
    106 
    107   JSGraph* jsgraph_;
    108   JSHeapBroker* js_heap_broker_;
    109   Type empty_string_type_;
    110   Type pointer_comparable_type_;
    111   TypeCache const& type_cache_;
    112 };
    113 
    114 }  // namespace compiler
    115 }  // namespace internal
    116 }  // namespace v8
    117 
    118 #endif  // V8_COMPILER_JS_TYPED_LOWERING_H_
    119