OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COMPILER_REPRESENTATION_CHANGE_H_ | 5 #ifndef V8_COMPILER_REPRESENTATION_CHANGE_H_ |
6 #define V8_COMPILER_REPRESENTATION_CHANGE_H_ | 6 #define V8_COMPILER_REPRESENTATION_CHANGE_H_ |
7 | 7 |
8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
67 } | 67 } |
68 | 68 |
69 Node* GetTaggedRepresentationFor(Node* node, MachineTypeUnion output_type) { | 69 Node* GetTaggedRepresentationFor(Node* node, MachineTypeUnion output_type) { |
70 // Eagerly fold representation changes for constants. | 70 // Eagerly fold representation changes for constants. |
71 switch (node->opcode()) { | 71 switch (node->opcode()) { |
72 case IrOpcode::kNumberConstant: | 72 case IrOpcode::kNumberConstant: |
73 case IrOpcode::kHeapConstant: | 73 case IrOpcode::kHeapConstant: |
74 return node; // No change necessary. | 74 return node; // No change necessary. |
75 case IrOpcode::kInt32Constant: | 75 case IrOpcode::kInt32Constant: |
76 if (output_type & kTypeUint32) { | 76 if (output_type & kTypeUint32) { |
77 uint32_t value = ValueOf<uint32_t>(node->op()); | 77 uint32_t value = OpParameter<uint32_t>(node); |
78 return jsgraph()->Constant(static_cast<double>(value)); | 78 return jsgraph()->Constant(static_cast<double>(value)); |
79 } else if (output_type & kTypeInt32) { | 79 } else if (output_type & kTypeInt32) { |
80 int32_t value = ValueOf<int32_t>(node->op()); | 80 int32_t value = OpParameter<int32_t>(node); |
81 return jsgraph()->Constant(value); | 81 return jsgraph()->Constant(value); |
82 } else if (output_type & kRepBit) { | 82 } else if (output_type & kRepBit) { |
83 return ValueOf<int32_t>(node->op()) == 0 ? jsgraph()->FalseConstant() | 83 return OpParameter<int32_t>(node) ? jsgraph()->TrueConstant() |
Michael Starzinger
2014/09/08 08:22:42
nit: Can we get back the "== 0" for readability?
Benedikt Meurer
2014/09/08 08:23:56
Done.
| |
84 : jsgraph()->TrueConstant(); | 84 : jsgraph()->FalseConstant(); |
85 } else { | 85 } else { |
86 return TypeError(node, output_type, kRepTagged); | 86 return TypeError(node, output_type, kRepTagged); |
87 } | 87 } |
88 case IrOpcode::kFloat64Constant: | 88 case IrOpcode::kFloat64Constant: |
89 return jsgraph()->Constant(ValueOf<double>(node->op())); | 89 return jsgraph()->Constant(OpParameter<double>(node)); |
90 default: | 90 default: |
91 break; | 91 break; |
92 } | 92 } |
93 // Select the correct X -> Tagged operator. | 93 // Select the correct X -> Tagged operator. |
94 Operator* op; | 94 Operator* op; |
95 if (output_type & kRepBit) { | 95 if (output_type & kRepBit) { |
96 op = simplified()->ChangeBitToBool(); | 96 op = simplified()->ChangeBitToBool(); |
97 } else if (output_type & rWord) { | 97 } else if (output_type & rWord) { |
98 if (output_type & kTypeUint32) { | 98 if (output_type & kTypeUint32) { |
99 op = simplified()->ChangeUint32ToTagged(); | 99 op = simplified()->ChangeUint32ToTagged(); |
100 } else if (output_type & kTypeInt32) { | 100 } else if (output_type & kTypeInt32) { |
101 op = simplified()->ChangeInt32ToTagged(); | 101 op = simplified()->ChangeInt32ToTagged(); |
102 } else { | 102 } else { |
103 return TypeError(node, output_type, kRepTagged); | 103 return TypeError(node, output_type, kRepTagged); |
104 } | 104 } |
105 } else if (output_type & kRepFloat64) { | 105 } else if (output_type & kRepFloat64) { |
106 op = simplified()->ChangeFloat64ToTagged(); | 106 op = simplified()->ChangeFloat64ToTagged(); |
107 } else { | 107 } else { |
108 return TypeError(node, output_type, kRepTagged); | 108 return TypeError(node, output_type, kRepTagged); |
109 } | 109 } |
110 return jsgraph()->graph()->NewNode(op, node); | 110 return jsgraph()->graph()->NewNode(op, node); |
111 } | 111 } |
112 | 112 |
113 Node* GetFloat64RepresentationFor(Node* node, MachineTypeUnion output_type) { | 113 Node* GetFloat64RepresentationFor(Node* node, MachineTypeUnion output_type) { |
114 // Eagerly fold representation changes for constants. | 114 // Eagerly fold representation changes for constants. |
115 switch (node->opcode()) { | 115 switch (node->opcode()) { |
116 case IrOpcode::kNumberConstant: | 116 case IrOpcode::kNumberConstant: |
117 return jsgraph()->Float64Constant(ValueOf<double>(node->op())); | 117 return jsgraph()->Float64Constant(OpParameter<double>(node)); |
118 case IrOpcode::kInt32Constant: | 118 case IrOpcode::kInt32Constant: |
119 if (output_type & kTypeUint32) { | 119 if (output_type & kTypeUint32) { |
120 uint32_t value = ValueOf<uint32_t>(node->op()); | 120 uint32_t value = OpParameter<uint32_t>(node); |
121 return jsgraph()->Float64Constant(static_cast<double>(value)); | 121 return jsgraph()->Float64Constant(static_cast<double>(value)); |
122 } else { | 122 } else { |
123 int32_t value = ValueOf<int32_t>(node->op()); | 123 int32_t value = OpParameter<int32_t>(node); |
124 return jsgraph()->Float64Constant(value); | 124 return jsgraph()->Float64Constant(value); |
125 } | 125 } |
126 case IrOpcode::kFloat64Constant: | 126 case IrOpcode::kFloat64Constant: |
127 return node; // No change necessary. | 127 return node; // No change necessary. |
128 default: | 128 default: |
129 break; | 129 break; |
130 } | 130 } |
131 // Select the correct X -> Float64 operator. | 131 // Select the correct X -> Float64 operator. |
132 Operator* op; | 132 Operator* op; |
133 if (output_type & kRepBit) { | 133 if (output_type & kRepBit) { |
(...skipping 13 matching lines...) Expand all Loading... | |
147 } | 147 } |
148 | 148 |
149 Node* GetWord32RepresentationFor(Node* node, MachineTypeUnion output_type, | 149 Node* GetWord32RepresentationFor(Node* node, MachineTypeUnion output_type, |
150 bool use_unsigned) { | 150 bool use_unsigned) { |
151 // Eagerly fold representation changes for constants. | 151 // Eagerly fold representation changes for constants. |
152 switch (node->opcode()) { | 152 switch (node->opcode()) { |
153 case IrOpcode::kInt32Constant: | 153 case IrOpcode::kInt32Constant: |
154 return node; // No change necessary. | 154 return node; // No change necessary. |
155 case IrOpcode::kNumberConstant: | 155 case IrOpcode::kNumberConstant: |
156 case IrOpcode::kFloat64Constant: { | 156 case IrOpcode::kFloat64Constant: { |
157 double value = ValueOf<double>(node->op()); | 157 double value = OpParameter<double>(node); |
158 if (value < 0) { | 158 if (value < 0) { |
159 DCHECK(IsInt32Double(value)); | 159 DCHECK(IsInt32Double(value)); |
160 int32_t iv = static_cast<int32_t>(value); | 160 int32_t iv = static_cast<int32_t>(value); |
161 return jsgraph()->Int32Constant(iv); | 161 return jsgraph()->Int32Constant(iv); |
162 } else { | 162 } else { |
163 DCHECK(IsUint32Double(value)); | 163 DCHECK(IsUint32Double(value)); |
164 int32_t iv = static_cast<int32_t>(static_cast<uint32_t>(value)); | 164 int32_t iv = static_cast<int32_t>(static_cast<uint32_t>(value)); |
165 return jsgraph()->Int32Constant(iv); | 165 return jsgraph()->Int32Constant(iv); |
166 } | 166 } |
167 } | 167 } |
(...skipping 17 matching lines...) Expand all Loading... | |
185 } else { | 185 } else { |
186 return TypeError(node, output_type, kRepWord32); | 186 return TypeError(node, output_type, kRepWord32); |
187 } | 187 } |
188 return jsgraph()->graph()->NewNode(op, node); | 188 return jsgraph()->graph()->NewNode(op, node); |
189 } | 189 } |
190 | 190 |
191 Node* GetBitRepresentationFor(Node* node, MachineTypeUnion output_type) { | 191 Node* GetBitRepresentationFor(Node* node, MachineTypeUnion output_type) { |
192 // Eagerly fold representation changes for constants. | 192 // Eagerly fold representation changes for constants. |
193 switch (node->opcode()) { | 193 switch (node->opcode()) { |
194 case IrOpcode::kInt32Constant: { | 194 case IrOpcode::kInt32Constant: { |
195 int32_t value = ValueOf<int32_t>(node->op()); | 195 int32_t value = OpParameter<int32_t>(node); |
196 if (value == 0 || value == 1) return node; | 196 if (value == 0 || value == 1) return node; |
197 return jsgraph()->OneConstant(); // value != 0 | 197 return jsgraph()->OneConstant(); // value != 0 |
198 } | 198 } |
199 case IrOpcode::kHeapConstant: { | 199 case IrOpcode::kHeapConstant: { |
200 Handle<Object> handle = ValueOf<Handle<Object> >(node->op()); | 200 Handle<Object> handle = OpParameter<Unique<Object> >(node).handle(); |
201 DCHECK(*handle == isolate()->heap()->true_value() || | 201 DCHECK(*handle == isolate()->heap()->true_value() || |
202 *handle == isolate()->heap()->false_value()); | 202 *handle == isolate()->heap()->false_value()); |
203 return jsgraph()->Int32Constant( | 203 return jsgraph()->Int32Constant( |
204 *handle == isolate()->heap()->true_value() ? 1 : 0); | 204 *handle == isolate()->heap()->true_value() ? 1 : 0); |
205 } | 205 } |
206 default: | 206 default: |
207 break; | 207 break; |
208 } | 208 } |
209 // Select the correct X -> Bit operator. | 209 // Select the correct X -> Bit operator. |
210 Operator* op; | 210 Operator* op; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
339 JSGraph* jsgraph() { return jsgraph_; } | 339 JSGraph* jsgraph() { return jsgraph_; } |
340 Isolate* isolate() { return isolate_; } | 340 Isolate* isolate() { return isolate_; } |
341 SimplifiedOperatorBuilder* simplified() { return simplified_; } | 341 SimplifiedOperatorBuilder* simplified() { return simplified_; } |
342 MachineOperatorBuilder* machine() { return machine_; } | 342 MachineOperatorBuilder* machine() { return machine_; } |
343 }; | 343 }; |
344 } | 344 } |
345 } | 345 } |
346 } // namespace v8::internal::compiler | 346 } // namespace v8::internal::compiler |
347 | 347 |
348 #endif // V8_COMPILER_REPRESENTATION_CHANGE_H_ | 348 #endif // V8_COMPILER_REPRESENTATION_CHANGE_H_ |
OLD | NEW |