1 // Copyright 2018 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 #include "src/compiler/machine-graph.h"
6
7 #include "src/codegen/external-reference.h"
8 #include "src/compiler/node-properties.h"
9
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13
Int32Constant(int32_t value)14 Node* MachineGraph::Int32Constant(int32_t value) {
15 Node** loc = cache_.FindInt32Constant(value);
16 if (*loc == nullptr) {
17 *loc = graph()->NewNode(common()->Int32Constant(value));
18 }
19 return *loc;
20 }
21
Int64Constant(int64_t value)22 Node* MachineGraph::Int64Constant(int64_t value) {
23 Node** loc = cache_.FindInt64Constant(value);
24 if (*loc == nullptr) {
25 *loc = graph()->NewNode(common()->Int64Constant(value));
26 }
27 return *loc;
28 }
29
IntPtrConstant(intptr_t value)30 Node* MachineGraph::IntPtrConstant(intptr_t value) {
31 return machine()->Is32() ? Int32Constant(static_cast<int32_t>(value))
32 : Int64Constant(static_cast<int64_t>(value));
33 }
34
UintPtrConstant(uintptr_t value)35 Node* MachineGraph::UintPtrConstant(uintptr_t value) {
36 return machine()->Is32() ? Uint32Constant(static_cast<uint32_t>(value))
37 : Uint64Constant(static_cast<uint64_t>(value));
38 }
39
TaggedIndexConstant(intptr_t value)40 Node* MachineGraph::TaggedIndexConstant(intptr_t value) {
41 int32_t value32 = static_cast<int32_t>(value);
42 Node** loc = cache_.FindTaggedIndexConstant(value32);
43 if (*loc == nullptr) {
44 *loc = graph()->NewNode(common()->TaggedIndexConstant(value32));
45 }
46 return *loc;
47 }
48
RelocatableInt32Constant(int32_t value,RelocInfo::Mode rmode)49 Node* MachineGraph::RelocatableInt32Constant(int32_t value,
50 RelocInfo::Mode rmode) {
51 Node** loc = cache_.FindRelocatableInt32Constant(
52 value, static_cast<RelocInfoMode>(rmode));
53 if (*loc == nullptr) {
54 *loc = graph()->NewNode(common()->RelocatableInt32Constant(value, rmode));
55 }
56 return *loc;
57 }
58
RelocatableInt64Constant(int64_t value,RelocInfo::Mode rmode)59 Node* MachineGraph::RelocatableInt64Constant(int64_t value,
60 RelocInfo::Mode rmode) {
61 Node** loc = cache_.FindRelocatableInt64Constant(
62 value, static_cast<RelocInfoMode>(rmode));
63 if (*loc == nullptr) {
64 *loc = graph()->NewNode(common()->RelocatableInt64Constant(value, rmode));
65 }
66 return *loc;
67 }
68
RelocatableIntPtrConstant(intptr_t value,RelocInfo::Mode rmode)69 Node* MachineGraph::RelocatableIntPtrConstant(intptr_t value,
70 RelocInfo::Mode rmode) {
71 return kSystemPointerSize == 8
72 ? RelocatableInt64Constant(value, rmode)
73 : RelocatableInt32Constant(static_cast<int>(value), rmode);
74 }
75
Float32Constant(float value)76 Node* MachineGraph::Float32Constant(float value) {
77 Node** loc = cache_.FindFloat32Constant(value);
78 if (*loc == nullptr) {
79 *loc = graph()->NewNode(common()->Float32Constant(value));
80 }
81 return *loc;
82 }
83
Float64Constant(double value)84 Node* MachineGraph::Float64Constant(double value) {
85 Node** loc = cache_.FindFloat64Constant(value);
86 if (*loc == nullptr) {
87 *loc = graph()->NewNode(common()->Float64Constant(value));
88 }
89 return *loc;
90 }
91
PointerConstant(intptr_t value)92 Node* MachineGraph::PointerConstant(intptr_t value) {
93 Node** loc = cache_.FindPointerConstant(value);
94 if (*loc == nullptr) {
95 *loc = graph()->NewNode(common()->PointerConstant(value));
96 }
97 return *loc;
98 }
99
ExternalConstant(ExternalReference reference)100 Node* MachineGraph::ExternalConstant(ExternalReference reference) {
101 Node** loc = cache_.FindExternalConstant(reference);
102 if (*loc == nullptr) {
103 *loc = graph()->NewNode(common()->ExternalConstant(reference));
104 }
105 return *loc;
106 }
107
ExternalConstant(Runtime::FunctionId function_id)108 Node* MachineGraph::ExternalConstant(Runtime::FunctionId function_id) {
109 return ExternalConstant(ExternalReference::Create(function_id));
110 }
111
112 } // namespace compiler
113 } // namespace internal
114 } // namespace v8
115