Chromium Code Reviews| 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/base/ieee754.h" | 9 #include "src/base/ieee754.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 599 if (m.HasValue()) return ReplaceFloat64(base::ieee754::tan(m.Value())); | 599 if (m.HasValue()) return ReplaceFloat64(base::ieee754::tan(m.Value())); |
| 600 break; | 600 break; |
| 601 } | 601 } |
| 602 case IrOpcode::kFloat64Tanh: { | 602 case IrOpcode::kFloat64Tanh: { |
| 603 Float64Matcher m(node->InputAt(0)); | 603 Float64Matcher m(node->InputAt(0)); |
| 604 if (m.HasValue()) return ReplaceFloat64(base::ieee754::tanh(m.Value())); | 604 if (m.HasValue()) return ReplaceFloat64(base::ieee754::tanh(m.Value())); |
| 605 break; | 605 break; |
| 606 } | 606 } |
| 607 case IrOpcode::kChangeFloat32ToFloat64: { | 607 case IrOpcode::kChangeFloat32ToFloat64: { |
| 608 Float32Matcher m(node->InputAt(0)); | 608 Float32Matcher m(node->InputAt(0)); |
| 609 if (m.HasValue()) return ReplaceFloat64(m.Value()); | 609 if (m.HasValue()) { |
| 610 if (!allow_signalling_nan_ && std::isnan(m.Value())) { | |
| 611 // Do some calculation to make guarantee the value is a quiet NaN. | |
| 612 return ReplaceFloat64(m.Value() + m.Value()); | |
|
titzer
2017/02/01 15:36:44
That doesn't seem right. It would return 2x the in
ahaas
2017/02/01 16:23:56
It is correct because m.Value() is a NaN, and ther
titzer
2017/02/01 18:00:33
Ok, make sense.
| |
| 613 } | |
| 614 return ReplaceFloat64(m.Value()); | |
| 615 } | |
| 610 break; | 616 break; |
| 611 } | 617 } |
| 612 case IrOpcode::kChangeFloat64ToInt32: { | 618 case IrOpcode::kChangeFloat64ToInt32: { |
| 613 Float64Matcher m(node->InputAt(0)); | 619 Float64Matcher m(node->InputAt(0)); |
| 614 if (m.HasValue()) return ReplaceInt32(FastD2I(m.Value())); | 620 if (m.HasValue()) return ReplaceInt32(FastD2I(m.Value())); |
| 615 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); | 621 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); |
| 616 break; | 622 break; |
| 617 } | 623 } |
| 618 case IrOpcode::kChangeFloat64ToUint32: { | 624 case IrOpcode::kChangeFloat64ToUint32: { |
| 619 Float64Matcher m(node->InputAt(0)); | 625 Float64Matcher m(node->InputAt(0)); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 648 return NoChange(); | 654 return NoChange(); |
| 649 } | 655 } |
| 650 case IrOpcode::kTruncateInt64ToInt32: { | 656 case IrOpcode::kTruncateInt64ToInt32: { |
| 651 Int64Matcher m(node->InputAt(0)); | 657 Int64Matcher m(node->InputAt(0)); |
| 652 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); | 658 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); |
| 653 if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0)); | 659 if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0)); |
| 654 break; | 660 break; |
| 655 } | 661 } |
| 656 case IrOpcode::kTruncateFloat64ToFloat32: { | 662 case IrOpcode::kTruncateFloat64ToFloat32: { |
| 657 Float64Matcher m(node->InputAt(0)); | 663 Float64Matcher m(node->InputAt(0)); |
| 658 if (m.HasValue()) return ReplaceFloat32(DoubleToFloat32(m.Value())); | 664 if (m.HasValue()) { |
| 659 if (m.IsChangeFloat32ToFloat64()) return Replace(m.node()->InputAt(0)); | 665 if (!allow_signalling_nan_ && std::isnan(m.Value())) { |
| 666 // Do some calculation to make guarantee the value is a quiet NaN. | |
| 667 return ReplaceFloat32(DoubleToFloat32(m.Value() + m.Value())); | |
| 668 } | |
| 669 return ReplaceFloat32(DoubleToFloat32(m.Value())); | |
| 670 } | |
| 671 if (allow_signalling_nan_ && m.IsChangeFloat32ToFloat64()) | |
| 672 return Replace(m.node()->InputAt(0)); | |
| 660 break; | 673 break; |
| 661 } | 674 } |
| 662 case IrOpcode::kRoundFloat64ToInt32: { | 675 case IrOpcode::kRoundFloat64ToInt32: { |
| 663 Float64Matcher m(node->InputAt(0)); | 676 Float64Matcher m(node->InputAt(0)); |
| 664 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); | 677 if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); |
| 665 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); | 678 if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); |
| 666 break; | 679 break; |
| 667 } | 680 } |
| 668 case IrOpcode::kFloat64InsertLowWord32: | 681 case IrOpcode::kFloat64InsertLowWord32: |
| 669 return ReduceFloat64InsertLowWord32(node); | 682 return ReduceFloat64InsertLowWord32(node); |
| (...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1423 MachineOperatorBuilder* MachineOperatorReducer::machine() const { | 1436 MachineOperatorBuilder* MachineOperatorReducer::machine() const { |
| 1424 return jsgraph()->machine(); | 1437 return jsgraph()->machine(); |
| 1425 } | 1438 } |
| 1426 | 1439 |
| 1427 | 1440 |
| 1428 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } | 1441 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } |
| 1429 | 1442 |
| 1430 } // namespace compiler | 1443 } // namespace compiler |
| 1431 } // namespace internal | 1444 } // namespace internal |
| 1432 } // namespace v8 | 1445 } // namespace v8 |
| OLD | NEW |