| 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 <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 } | 51 } |
| 52 if (use_type & kRepTagged) { | 52 if (use_type & kRepTagged) { |
| 53 return GetTaggedRepresentationFor(node, output_type); | 53 return GetTaggedRepresentationFor(node, output_type); |
| 54 } else if (use_type & kRepFloat32) { | 54 } else if (use_type & kRepFloat32) { |
| 55 return GetFloat32RepresentationFor(node, output_type); | 55 return GetFloat32RepresentationFor(node, output_type); |
| 56 } else if (use_type & kRepFloat64) { | 56 } else if (use_type & kRepFloat64) { |
| 57 return GetFloat64RepresentationFor(node, output_type); | 57 return GetFloat64RepresentationFor(node, output_type); |
| 58 } else if (use_type & kRepBit) { | 58 } else if (use_type & kRepBit) { |
| 59 return GetBitRepresentationFor(node, output_type); | 59 return GetBitRepresentationFor(node, output_type); |
| 60 } else if (IsWord(use_type)) { | 60 } else if (IsWord(use_type)) { |
| 61 return GetWord32RepresentationFor(node, output_type, | 61 return GetWord32RepresentationFor(node, output_type); |
| 62 use_type & kTypeUint32); | |
| 63 } else if (use_type & kRepWord64) { | 62 } else if (use_type & kRepWord64) { |
| 64 return GetWord64RepresentationFor(node, output_type); | 63 return GetWord64RepresentationFor(node, output_type); |
| 65 } else { | 64 } else { |
| 66 return node; | 65 return node; |
| 67 } | 66 } |
| 68 } | 67 } |
| 69 | 68 |
| 70 Node* GetTaggedRepresentationFor(Node* node, MachineTypeUnion output_type) { | 69 Node* GetTaggedRepresentationFor(Node* node, MachineTypeUnion output_type) { |
| 71 // Eagerly fold representation changes for constants. | 70 // Eagerly fold representation changes for constants. |
| 72 switch (node->opcode()) { | 71 switch (node->opcode()) { |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 op = machine()->TruncateFloat64ToInt32(TruncationMode::kJavaScript); | 237 op = machine()->TruncateFloat64ToInt32(TruncationMode::kJavaScript); |
| 239 } else if (output_type & kRepTagged) { | 238 } else if (output_type & kRepTagged) { |
| 240 node = InsertChangeTaggedToFloat64(node); | 239 node = InsertChangeTaggedToFloat64(node); |
| 241 op = machine()->TruncateFloat64ToInt32(TruncationMode::kJavaScript); | 240 op = machine()->TruncateFloat64ToInt32(TruncationMode::kJavaScript); |
| 242 } else { | 241 } else { |
| 243 return TypeError(node, output_type, kRepWord32); | 242 return TypeError(node, output_type, kRepWord32); |
| 244 } | 243 } |
| 245 return jsgraph()->graph()->NewNode(op, node); | 244 return jsgraph()->graph()->NewNode(op, node); |
| 246 } | 245 } |
| 247 | 246 |
| 248 Node* GetWord32RepresentationFor(Node* node, MachineTypeUnion output_type, | 247 Node* GetWord32RepresentationFor(Node* node, MachineTypeUnion output_type) { |
| 249 bool use_unsigned) { | |
| 250 // Eagerly fold representation changes for constants. | 248 // Eagerly fold representation changes for constants. |
| 251 switch (node->opcode()) { | 249 switch (node->opcode()) { |
| 252 case IrOpcode::kInt32Constant: | 250 case IrOpcode::kInt32Constant: |
| 253 return node; // No change necessary. | 251 return node; // No change necessary. |
| 254 case IrOpcode::kFloat32Constant: | 252 case IrOpcode::kFloat32Constant: |
| 255 return MakeInt32Constant(OpParameter<float>(node)); | 253 return MakeInt32Constant(OpParameter<float>(node)); |
| 256 case IrOpcode::kNumberConstant: | 254 case IrOpcode::kNumberConstant: |
| 257 case IrOpcode::kFloat64Constant: | 255 case IrOpcode::kFloat64Constant: |
| 258 return MakeInt32Constant(OpParameter<double>(node)); | 256 return MakeInt32Constant(OpParameter<double>(node)); |
| 259 default: | 257 default: |
| 260 break; | 258 break; |
| 261 } | 259 } |
| 262 // Select the correct X -> Word32 operator. | 260 // Select the correct X -> Word32 operator. |
| 263 const Operator* op; | 261 const Operator* op; |
| 262 Type* type = NodeProperties::GetType(node); |
| 264 if (output_type & kRepBit) { | 263 if (output_type & kRepBit) { |
| 265 return node; // Sloppy comparison -> word32 | 264 return node; // Sloppy comparison -> word32 |
| 266 } else if (output_type & kRepFloat64) { | 265 } else if (output_type & kRepFloat64) { |
| 267 if (output_type & kTypeUint32 || use_unsigned) { | 266 if (output_type & kTypeUint32 || type->Is(Type::Unsigned32())) { |
| 268 op = machine()->ChangeFloat64ToUint32(); | 267 op = machine()->ChangeFloat64ToUint32(); |
| 268 } else if (output_type & kTypeInt32 || type->Is(Type::Signed32())) { |
| 269 op = machine()->ChangeFloat64ToInt32(); |
| 269 } else { | 270 } else { |
| 270 op = machine()->ChangeFloat64ToInt32(); | 271 op = machine()->TruncateFloat64ToInt32(TruncationMode::kJavaScript); |
| 271 } | 272 } |
| 272 } else if (output_type & kRepFloat32) { | 273 } else if (output_type & kRepFloat32) { |
| 273 node = InsertChangeFloat32ToFloat64(node); // float32 -> float64 -> int32 | 274 node = InsertChangeFloat32ToFloat64(node); // float32 -> float64 -> int32 |
| 274 if (output_type & kTypeUint32 || use_unsigned) { | 275 if (output_type & kTypeUint32 || type->Is(Type::Unsigned32())) { |
| 275 op = machine()->ChangeFloat64ToUint32(); | 276 op = machine()->ChangeFloat64ToUint32(); |
| 277 } else if (output_type & kTypeInt32 || type->Is(Type::Signed32())) { |
| 278 op = machine()->ChangeFloat64ToInt32(); |
| 276 } else { | 279 } else { |
| 277 op = machine()->ChangeFloat64ToInt32(); | 280 op = machine()->TruncateFloat64ToInt32(TruncationMode::kJavaScript); |
| 278 } | 281 } |
| 279 } else if (output_type & kRepTagged) { | 282 } else if (output_type & kRepTagged) { |
| 280 if (output_type & kTypeUint32 || use_unsigned) { | 283 if (output_type & kTypeUint32 || type->Is(Type::Unsigned32())) { |
| 281 op = simplified()->ChangeTaggedToUint32(); | 284 op = simplified()->ChangeTaggedToUint32(); |
| 285 } else if (output_type & kTypeInt32 || type->Is(Type::Signed32())) { |
| 286 op = simplified()->ChangeTaggedToInt32(); |
| 282 } else { | 287 } else { |
| 283 op = simplified()->ChangeTaggedToInt32(); | 288 node = InsertChangeTaggedToFloat64(node); |
| 289 op = machine()->TruncateFloat64ToInt32(TruncationMode::kJavaScript); |
| 284 } | 290 } |
| 285 } else { | 291 } else { |
| 286 return TypeError(node, output_type, kRepWord32); | 292 return TypeError(node, output_type, kRepWord32); |
| 287 } | 293 } |
| 288 return jsgraph()->graph()->NewNode(op, node); | 294 return jsgraph()->graph()->NewNode(op, node); |
| 289 } | 295 } |
| 290 | 296 |
| 291 Node* GetBitRepresentationFor(Node* node, MachineTypeUnion output_type) { | 297 Node* GetBitRepresentationFor(Node* node, MachineTypeUnion output_type) { |
| 292 // Eagerly fold representation changes for constants. | 298 // Eagerly fold representation changes for constants. |
| 293 switch (node->opcode()) { | 299 switch (node->opcode()) { |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 Factory* factory() const { return isolate()->factory(); } | 464 Factory* factory() const { return isolate()->factory(); } |
| 459 SimplifiedOperatorBuilder* simplified() { return jsgraph()->simplified(); } | 465 SimplifiedOperatorBuilder* simplified() { return jsgraph()->simplified(); } |
| 460 MachineOperatorBuilder* machine() { return jsgraph()->machine(); } | 466 MachineOperatorBuilder* machine() { return jsgraph()->machine(); } |
| 461 }; | 467 }; |
| 462 | 468 |
| 463 } // namespace compiler | 469 } // namespace compiler |
| 464 } // namespace internal | 470 } // namespace internal |
| 465 } // namespace v8 | 471 } // namespace v8 |
| 466 | 472 |
| 467 #endif // V8_COMPILER_REPRESENTATION_CHANGE_H_ | 473 #endif // V8_COMPILER_REPRESENTATION_CHANGE_H_ |
| OLD | NEW |