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_BUILTIN_REDUCER_H_
      6 #define V8_COMPILER_JS_BUILTIN_REDUCER_H_
      7 
      8 #include "src/base/compiler-specific.h"
      9 #include "src/base/flags.h"
     10 #include "src/compiler/graph-reducer.h"
     11 #include "src/globals.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 
     16 // Forward declarations.
     17 class CompilationDependencies;
     18 class Factory;
     19 
     20 namespace compiler {
     21 
     22 // Forward declarations.
     23 class CommonOperatorBuilder;
     24 struct FieldAccess;
     25 class JSGraph;
     26 class JSOperatorBuilder;
     27 class SimplifiedOperatorBuilder;
     28 class TypeCache;
     29 
     30 class V8_EXPORT_PRIVATE JSBuiltinReducer final
     31     : public NON_EXPORTED_BASE(AdvancedReducer) {
     32  public:
     33   // Flags that control the mode of operation.
     34   enum Flag {
     35     kNoFlags = 0u,
     36     kDeoptimizationEnabled = 1u << 0,
     37   };
     38   typedef base::Flags<Flag> Flags;
     39 
     40   JSBuiltinReducer(Editor* editor, JSGraph* jsgraph, Flags flags,
     41                    CompilationDependencies* dependencies,
     42                    Handle<Context> native_context);
     43   ~JSBuiltinReducer() final {}
     44 
     45   Reduction Reduce(Node* node) final;
     46 
     47  private:
     48   Reduction ReduceArrayIterator(Node* node, IterationKind kind);
     49   Reduction ReduceTypedArrayIterator(Node* node, IterationKind kind);
     50   Reduction ReduceArrayIterator(Handle<Map> receiver_map, Node* node,
     51                                 IterationKind kind,
     52                                 ArrayIteratorKind iter_kind);
     53   Reduction ReduceArrayIteratorNext(Node* node);
     54   Reduction ReduceFastArrayIteratorNext(Handle<Map> iterator_map, Node* node,
     55                                         IterationKind kind);
     56   Reduction ReduceTypedArrayIteratorNext(Handle<Map> iterator_map, Node* node,
     57                                          IterationKind kind);
     58   Reduction ReduceArrayPop(Node* node);
     59   Reduction ReduceArrayPush(Node* node);
     60   Reduction ReduceDateNow(Node* node);
     61   Reduction ReduceDateGetTime(Node* node);
     62   Reduction ReduceGlobalIsFinite(Node* node);
     63   Reduction ReduceGlobalIsNaN(Node* node);
     64   Reduction ReduceMathAbs(Node* node);
     65   Reduction ReduceMathAcos(Node* node);
     66   Reduction ReduceMathAcosh(Node* node);
     67   Reduction ReduceMathAsin(Node* node);
     68   Reduction ReduceMathAsinh(Node* node);
     69   Reduction ReduceMathAtan(Node* node);
     70   Reduction ReduceMathAtanh(Node* node);
     71   Reduction ReduceMathAtan2(Node* node);
     72   Reduction ReduceMathCbrt(Node* node);
     73   Reduction ReduceMathCeil(Node* node);
     74   Reduction ReduceMathClz32(Node* node);
     75   Reduction ReduceMathCos(Node* node);
     76   Reduction ReduceMathCosh(Node* node);
     77   Reduction ReduceMathExp(Node* node);
     78   Reduction ReduceMathExpm1(Node* node);
     79   Reduction ReduceMathFloor(Node* node);
     80   Reduction ReduceMathFround(Node* node);
     81   Reduction ReduceMathImul(Node* node);
     82   Reduction ReduceMathLog(Node* node);
     83   Reduction ReduceMathLog1p(Node* node);
     84   Reduction ReduceMathLog10(Node* node);
     85   Reduction ReduceMathLog2(Node* node);
     86   Reduction ReduceMathMax(Node* node);
     87   Reduction ReduceMathMin(Node* node);
     88   Reduction ReduceMathPow(Node* node);
     89   Reduction ReduceMathRound(Node* node);
     90   Reduction ReduceMathSign(Node* node);
     91   Reduction ReduceMathSin(Node* node);
     92   Reduction ReduceMathSinh(Node* node);
     93   Reduction ReduceMathSqrt(Node* node);
     94   Reduction ReduceMathTan(Node* node);
     95   Reduction ReduceMathTanh(Node* node);
     96   Reduction ReduceMathTrunc(Node* node);
     97   Reduction ReduceNumberIsFinite(Node* node);
     98   Reduction ReduceNumberIsInteger(Node* node);
     99   Reduction ReduceNumberIsNaN(Node* node);
    100   Reduction ReduceNumberIsSafeInteger(Node* node);
    101   Reduction ReduceNumberParseInt(Node* node);
    102   Reduction ReduceObjectCreate(Node* node);
    103   Reduction ReduceStringCharAt(Node* node);
    104   Reduction ReduceStringCharCodeAt(Node* node);
    105   Reduction ReduceStringFromCharCode(Node* node);
    106   Reduction ReduceStringIndexOf(Node* node);
    107   Reduction ReduceStringIterator(Node* node);
    108   Reduction ReduceStringIteratorNext(Node* node);
    109   Reduction ReduceArrayBufferViewAccessor(Node* node,
    110                                           InstanceType instance_type,
    111                                           FieldAccess const& access);
    112 
    113   Node* ToNumber(Node* value);
    114   Node* ToUint32(Node* value);
    115 
    116   Flags flags() const { return flags_; }
    117   Graph* graph() const;
    118   Factory* factory() const;
    119   JSGraph* jsgraph() const { return jsgraph_; }
    120   Isolate* isolate() const;
    121   Handle<Context> native_context() const { return native_context_; }
    122   CommonOperatorBuilder* common() const;
    123   SimplifiedOperatorBuilder* simplified() const;
    124   JSOperatorBuilder* javascript() const;
    125   CompilationDependencies* dependencies() const { return dependencies_; }
    126 
    127   CompilationDependencies* const dependencies_;
    128   Flags const flags_;
    129   JSGraph* const jsgraph_;
    130   Handle<Context> const native_context_;
    131   TypeCache const& type_cache_;
    132 };
    133 
    134 DEFINE_OPERATORS_FOR_FLAGS(JSBuiltinReducer::Flags)
    135 
    136 }  // namespace compiler
    137 }  // namespace internal
    138 }  // namespace v8
    139 
    140 #endif  // V8_COMPILER_JS_BUILTIN_REDUCER_H_
    141