• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_COMMON_NODE_CACHE_H_
6 #define V8_COMPILER_COMMON_NODE_CACHE_H_
7 
8 #include "src/compiler/node-cache.h"
9 
10 namespace v8 {
11 namespace internal {
12 
13 // Forward declarations.
14 class ExternalReference;
15 class HeapObject;
16 template <typename>
17 class Handle;
18 
19 
20 namespace compiler {
21 
22 // Bundles various caches for common nodes.
23 class CommonNodeCache final {
24  public:
CommonNodeCache(Zone * zone)25   explicit CommonNodeCache(Zone* zone)
26       : int32_constants_(zone),
27         int64_constants_(zone),
28         tagged_index_constants_(zone),
29         float32_constants_(zone),
30         float64_constants_(zone),
31         external_constants_(zone),
32         pointer_constants_(zone),
33         number_constants_(zone),
34         heap_constants_(zone),
35         relocatable_int32_constants_(zone),
36         relocatable_int64_constants_(zone) {}
37   ~CommonNodeCache() = default;
38 
39   CommonNodeCache(const CommonNodeCache&) = delete;
40   CommonNodeCache& operator=(const CommonNodeCache&) = delete;
41 
FindInt32Constant(int32_t value)42   Node** FindInt32Constant(int32_t value) {
43     return int32_constants_.Find(value);
44   }
45 
FindInt64Constant(int64_t value)46   Node** FindInt64Constant(int64_t value) {
47     return int64_constants_.Find(value);
48   }
49 
FindTaggedIndexConstant(int32_t value)50   Node** FindTaggedIndexConstant(int32_t value) {
51     return tagged_index_constants_.Find(value);
52   }
53 
FindFloat32Constant(float value)54   Node** FindFloat32Constant(float value) {
55     // We canonicalize float constants at the bit representation level.
56     return float32_constants_.Find(bit_cast<int32_t>(value));
57   }
58 
FindFloat64Constant(double value)59   Node** FindFloat64Constant(double value) {
60     // We canonicalize double constants at the bit representation level.
61     return float64_constants_.Find(bit_cast<int64_t>(value));
62   }
63 
64   Node** FindExternalConstant(ExternalReference value);
65 
FindPointerConstant(intptr_t value)66   Node** FindPointerConstant(intptr_t value) {
67     return pointer_constants_.Find(value);
68   }
69 
FindNumberConstant(double value)70   Node** FindNumberConstant(double value) {
71     // We canonicalize double constants at the bit representation level.
72     return number_constants_.Find(bit_cast<int64_t>(value));
73   }
74 
75   Node** FindHeapConstant(Handle<HeapObject> value);
76 
FindRelocatableInt32Constant(int32_t value,RelocInfoMode rmode)77   Node** FindRelocatableInt32Constant(int32_t value, RelocInfoMode rmode) {
78     return relocatable_int32_constants_.Find(std::make_pair(value, rmode));
79   }
80 
FindRelocatableInt64Constant(int64_t value,RelocInfoMode rmode)81   Node** FindRelocatableInt64Constant(int64_t value, RelocInfoMode rmode) {
82     return relocatable_int64_constants_.Find(std::make_pair(value, rmode));
83   }
84 
85   // Return all nodes from the cache.
86   void GetCachedNodes(ZoneVector<Node*>* nodes);
87 
88  private:
89   Int32NodeCache int32_constants_;
90   Int64NodeCache int64_constants_;
91   Int32NodeCache tagged_index_constants_;
92   Int32NodeCache float32_constants_;
93   Int64NodeCache float64_constants_;
94   IntPtrNodeCache external_constants_;
95   IntPtrNodeCache pointer_constants_;
96   Int64NodeCache number_constants_;
97   IntPtrNodeCache heap_constants_;
98   RelocInt32NodeCache relocatable_int32_constants_;
99   RelocInt64NodeCache relocatable_int64_constants_;
100 };
101 
102 }  // namespace compiler
103 }  // namespace internal
104 }  // namespace v8
105 
106 #endif  // V8_COMPILER_COMMON_NODE_CACHE_H_
107