| 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 #include "src/compiler/machine-operator-reducer.h" | 5 #include "src/compiler/machine-operator-reducer.h" |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/base/division-by-constant.h" | 8 #include "src/base/division-by-constant.h" |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/compiler/diamond.h" | 10 #include "src/compiler/diamond.h" |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 case IrOpcode::kChangeUint32ToFloat64: { | 412 case IrOpcode::kChangeUint32ToFloat64: { |
| 413 Uint32Matcher m(node->InputAt(0)); | 413 Uint32Matcher m(node->InputAt(0)); |
| 414 if (m.HasValue()) return ReplaceFloat64(FastUI2D(m.Value())); | 414 if (m.HasValue()) return ReplaceFloat64(FastUI2D(m.Value())); |
| 415 break; | 415 break; |
| 416 } | 416 } |
| 417 case IrOpcode::kChangeUint32ToUint64: { | 417 case IrOpcode::kChangeUint32ToUint64: { |
| 418 Uint32Matcher m(node->InputAt(0)); | 418 Uint32Matcher m(node->InputAt(0)); |
| 419 if (m.HasValue()) return ReplaceInt64(static_cast<uint64_t>(m.Value())); | 419 if (m.HasValue()) return ReplaceInt64(static_cast<uint64_t>(m.Value())); |
| 420 break; | 420 break; |
| 421 } | 421 } |
| 422 case IrOpcode::kTruncateFloat64ToInt32: | 422 case IrOpcode::kTruncateFloat64ToWord32: { |
| 423 return ReduceTruncateFloat64ToInt32(node); | 423 Float64Matcher m(node->InputAt(0)); |
| 424 if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); |
| 425 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); |
| 426 return NoChange(); |
| 427 } |
| 424 case IrOpcode::kTruncateInt64ToInt32: { | 428 case IrOpcode::kTruncateInt64ToInt32: { |
| 425 Int64Matcher m(node->InputAt(0)); | 429 Int64Matcher m(node->InputAt(0)); |
| 426 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); | 430 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); |
| 427 if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0)); | 431 if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0)); |
| 428 break; | 432 break; |
| 429 } | 433 } |
| 430 case IrOpcode::kTruncateFloat64ToFloat32: { | 434 case IrOpcode::kTruncateFloat64ToFloat32: { |
| 431 Float64Matcher m(node->InputAt(0)); | 435 Float64Matcher m(node->InputAt(0)); |
| 432 if (m.HasValue()) return ReplaceFloat32(DoubleToFloat32(m.Value())); | 436 if (m.HasValue()) return ReplaceFloat32(DoubleToFloat32(m.Value())); |
| 433 if (m.IsChangeFloat32ToFloat64()) return Replace(m.node()->InputAt(0)); | 437 if (m.IsChangeFloat32ToFloat64()) return Replace(m.node()->InputAt(0)); |
| 434 break; | 438 break; |
| 435 } | 439 } |
| 440 case IrOpcode::kRoundFloat64ToInt32: { |
| 441 Float64Matcher m(node->InputAt(0)); |
| 442 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); |
| 443 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); |
| 444 break; |
| 445 } |
| 436 case IrOpcode::kFloat64InsertLowWord32: | 446 case IrOpcode::kFloat64InsertLowWord32: |
| 437 return ReduceFloat64InsertLowWord32(node); | 447 return ReduceFloat64InsertLowWord32(node); |
| 438 case IrOpcode::kFloat64InsertHighWord32: | 448 case IrOpcode::kFloat64InsertHighWord32: |
| 439 return ReduceFloat64InsertHighWord32(node); | 449 return ReduceFloat64InsertHighWord32(node); |
| 440 case IrOpcode::kStore: | 450 case IrOpcode::kStore: |
| 441 return ReduceStore(node); | 451 return ReduceStore(node); |
| 442 case IrOpcode::kFloat64Equal: | 452 case IrOpcode::kFloat64Equal: |
| 443 case IrOpcode::kFloat64LessThan: | 453 case IrOpcode::kFloat64LessThan: |
| 444 case IrOpcode::kFloat64LessThanOrEqual: | 454 case IrOpcode::kFloat64LessThanOrEqual: |
| 445 return ReduceFloat64Compare(node); | 455 return ReduceFloat64Compare(node); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 node->ReplaceInput(1, Int32Mul(quotient, Uint32Constant(divisor))); | 648 node->ReplaceInput(1, Int32Mul(quotient, Uint32Constant(divisor))); |
| 639 node->TrimInputCount(2); | 649 node->TrimInputCount(2); |
| 640 NodeProperties::ChangeOp(node, machine()->Int32Sub()); | 650 NodeProperties::ChangeOp(node, machine()->Int32Sub()); |
| 641 } | 651 } |
| 642 return Changed(node); | 652 return Changed(node); |
| 643 } | 653 } |
| 644 return NoChange(); | 654 return NoChange(); |
| 645 } | 655 } |
| 646 | 656 |
| 647 | 657 |
| 648 Reduction MachineOperatorReducer::ReduceTruncateFloat64ToInt32(Node* node) { | |
| 649 Float64Matcher m(node->InputAt(0)); | |
| 650 if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); | |
| 651 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); | |
| 652 if (m.IsPhi()) { | |
| 653 Node* const phi = m.node(); | |
| 654 DCHECK_EQ(MachineRepresentation::kFloat64, PhiRepresentationOf(phi->op())); | |
| 655 if (phi->OwnedBy(node)) { | |
| 656 // TruncateFloat64ToInt32[mode](Phi[Float64](x1,...,xn)) | |
| 657 // => Phi[Int32](TruncateFloat64ToInt32[mode](x1), | |
| 658 // ..., | |
| 659 // TruncateFloat64ToInt32[mode](xn)) | |
| 660 const int value_input_count = phi->InputCount() - 1; | |
| 661 for (int i = 0; i < value_input_count; ++i) { | |
| 662 Node* input = graph()->NewNode(node->op(), phi->InputAt(i)); | |
| 663 // TODO(bmeurer): Reschedule input for reduction once we have Revisit() | |
| 664 // instead of recursing into ReduceTruncateFloat64ToInt32() here. | |
| 665 Reduction reduction = ReduceTruncateFloat64ToInt32(input); | |
| 666 if (reduction.Changed()) input = reduction.replacement(); | |
| 667 phi->ReplaceInput(i, input); | |
| 668 } | |
| 669 NodeProperties::ChangeOp( | |
| 670 phi, | |
| 671 common()->Phi(MachineRepresentation::kWord32, value_input_count)); | |
| 672 return Replace(phi); | |
| 673 } | |
| 674 } | |
| 675 return NoChange(); | |
| 676 } | |
| 677 | |
| 678 | |
| 679 Reduction MachineOperatorReducer::ReduceStore(Node* node) { | 658 Reduction MachineOperatorReducer::ReduceStore(Node* node) { |
| 680 MachineRepresentation const rep = | 659 MachineRepresentation const rep = |
| 681 StoreRepresentationOf(node->op()).representation(); | 660 StoreRepresentationOf(node->op()).representation(); |
| 682 Node* const value = node->InputAt(2); | 661 Node* const value = node->InputAt(2); |
| 683 switch (value->opcode()) { | 662 switch (value->opcode()) { |
| 684 case IrOpcode::kWord32And: { | 663 case IrOpcode::kWord32And: { |
| 685 Uint32BinopMatcher m(value); | 664 Uint32BinopMatcher m(value); |
| 686 if (m.right().HasValue() && ((rep == MachineRepresentation::kWord8 && | 665 if (m.right().HasValue() && ((rep == MachineRepresentation::kWord8 && |
| 687 (m.right().Value() & 0xff) == 0xff) || | 666 (m.right().Value() & 0xff) == 0xff) || |
| 688 (rep == MachineRepresentation::kWord16 && | 667 (rep == MachineRepresentation::kWord16 && |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 MachineOperatorBuilder* MachineOperatorReducer::machine() const { | 1061 MachineOperatorBuilder* MachineOperatorReducer::machine() const { |
| 1083 return jsgraph()->machine(); | 1062 return jsgraph()->machine(); |
| 1084 } | 1063 } |
| 1085 | 1064 |
| 1086 | 1065 |
| 1087 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } | 1066 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } |
| 1088 | 1067 |
| 1089 } // namespace compiler | 1068 } // namespace compiler |
| 1090 } // namespace internal | 1069 } // namespace internal |
| 1091 } // namespace v8 | 1070 } // namespace v8 |
| OLD | NEW |