OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 #include "src/compiler/representation-change.h" | 5 #include "src/compiler/representation-change.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 } | 361 } |
362 | 362 |
363 Node* RepresentationChanger::MakeTruncatedInt32Constant(double value) { | 363 Node* RepresentationChanger::MakeTruncatedInt32Constant(double value) { |
364 return jsgraph()->Int32Constant(DoubleToInt32(value)); | 364 return jsgraph()->Int32Constant(DoubleToInt32(value)); |
365 } | 365 } |
366 | 366 |
367 Node* RepresentationChanger::GetWord32RepresentationFor( | 367 Node* RepresentationChanger::GetWord32RepresentationFor( |
368 Node* node, MachineRepresentation output_rep, Type* output_type, | 368 Node* node, MachineRepresentation output_rep, Type* output_type, |
369 Node* use_node, UseInfo use_info) { | 369 Node* use_node, UseInfo use_info) { |
370 // Eagerly fold representation changes for constants. | 370 // Eagerly fold representation changes for constants. |
371 // TODO(jarin) Properly fold constants in presence of type check. | 371 switch (node->opcode()) { |
372 if (use_info.type_check() == TypeCheckKind::kNone) { | 372 case IrOpcode::kInt32Constant: |
373 switch (node->opcode()) { | 373 return node; // No change necessary. |
374 case IrOpcode::kInt32Constant: | 374 case IrOpcode::kFloat32Constant: { |
375 return node; // No change necessary. | 375 float const fv = OpParameter<float>(node); |
376 case IrOpcode::kFloat32Constant: | 376 if (use_info.type_check() == TypeCheckKind::kNone || |
377 return MakeTruncatedInt32Constant(OpParameter<float>(node)); | 377 (use_info.type_check() == TypeCheckKind::kSigned32 && |
378 case IrOpcode::kNumberConstant: | 378 IsInt32Double(fv))) { |
379 case IrOpcode::kFloat64Constant: | 379 return MakeTruncatedInt32Constant(fv); |
380 return MakeTruncatedInt32Constant(OpParameter<double>(node)); | 380 } |
381 default: | 381 break; |
382 break; | |
383 } | 382 } |
| 383 case IrOpcode::kNumberConstant: |
| 384 case IrOpcode::kFloat64Constant: { |
| 385 double const fv = OpParameter<double>(node); |
| 386 if (use_info.type_check() == TypeCheckKind::kNone || |
| 387 (use_info.type_check() == TypeCheckKind::kSigned32 && |
| 388 IsInt32Double(fv))) { |
| 389 return MakeTruncatedInt32Constant(fv); |
| 390 } |
| 391 break; |
| 392 } |
| 393 default: |
| 394 break; |
384 } | 395 } |
385 | 396 |
386 // Select the correct X -> Word32 operator. | 397 // Select the correct X -> Word32 operator. |
387 const Operator* op = nullptr; | 398 const Operator* op = nullptr; |
388 if (output_rep == MachineRepresentation::kBit) { | 399 if (output_rep == MachineRepresentation::kBit) { |
389 return node; // Sloppy comparison -> word32 | 400 return node; // Sloppy comparison -> word32 |
390 } else if (output_rep == MachineRepresentation::kFloat64) { | 401 } else if (output_rep == MachineRepresentation::kFloat64) { |
391 if (output_type->Is(Type::Unsigned32())) { | 402 if (output_type->Is(Type::Unsigned32())) { |
392 op = machine()->ChangeFloat64ToUint32(); | 403 op = machine()->ChangeFloat64ToUint32(); |
393 } else if (output_type->Is(Type::Signed32())) { | 404 } else if (output_type->Is(Type::Signed32())) { |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 } | 768 } |
758 | 769 |
759 Node* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) { | 770 Node* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) { |
760 return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), | 771 return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), |
761 node); | 772 node); |
762 } | 773 } |
763 | 774 |
764 } // namespace compiler | 775 } // namespace compiler |
765 } // namespace internal | 776 } // namespace internal |
766 } // namespace v8 | 777 } // namespace v8 |
OLD | NEW |