Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1085)

Side by Side Diff: src/compiler/effect-control-linearizer.cc

Issue 2722483003: [turbofan] Introduce dedicated ObjectIsNaN operator. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/effect-control-linearizer.h" 5 #include "src/compiler/effect-control-linearizer.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler/access-builder.h" 8 #include "src/compiler/access-builder.h"
9 #include "src/compiler/compiler-source-position-table.h" 9 #include "src/compiler/compiler-source-position-table.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 break; 714 break;
715 case IrOpcode::kTruncateTaggedToWord32: 715 case IrOpcode::kTruncateTaggedToWord32:
716 result = LowerTruncateTaggedToWord32(node); 716 result = LowerTruncateTaggedToWord32(node);
717 break; 717 break;
718 case IrOpcode::kCheckedTruncateTaggedToWord32: 718 case IrOpcode::kCheckedTruncateTaggedToWord32:
719 result = LowerCheckedTruncateTaggedToWord32(node, frame_state); 719 result = LowerCheckedTruncateTaggedToWord32(node, frame_state);
720 break; 720 break;
721 case IrOpcode::kObjectIsDetectableCallable: 721 case IrOpcode::kObjectIsDetectableCallable:
722 result = LowerObjectIsDetectableCallable(node); 722 result = LowerObjectIsDetectableCallable(node);
723 break; 723 break;
724 case IrOpcode::kObjectIsNaN:
725 result = LowerObjectIsNaN(node);
726 break;
724 case IrOpcode::kObjectIsNonCallable: 727 case IrOpcode::kObjectIsNonCallable:
725 result = LowerObjectIsNonCallable(node); 728 result = LowerObjectIsNonCallable(node);
726 break; 729 break;
727 case IrOpcode::kObjectIsNumber: 730 case IrOpcode::kObjectIsNumber:
728 result = LowerObjectIsNumber(node); 731 result = LowerObjectIsNumber(node);
729 break; 732 break;
730 case IrOpcode::kObjectIsReceiver: 733 case IrOpcode::kObjectIsReceiver:
731 result = LowerObjectIsReceiver(node); 734 result = LowerObjectIsReceiver(node);
732 break; 735 break;
733 case IrOpcode::kObjectIsSmi: 736 case IrOpcode::kObjectIsSmi:
(...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after
1708 (1 << Map::kIsUndetectable)))); 1711 (1 << Map::kIsUndetectable))));
1709 __ Goto(&done, vfalse); 1712 __ Goto(&done, vfalse);
1710 1713
1711 __ Bind(&if_smi); 1714 __ Bind(&if_smi);
1712 __ Goto(&done, __ Int32Constant(0)); 1715 __ Goto(&done, __ Int32Constant(0));
1713 1716
1714 __ Bind(&done); 1717 __ Bind(&done);
1715 return done.PhiAt(0); 1718 return done.PhiAt(0);
1716 } 1719 }
1717 1720
1721 Node* EffectControlLinearizer::LowerObjectIsNaN(Node* node) {
1722 Node* value = node->InputAt(0);
1723 Node* zero = __ Int32Constant(0);
1724
1725 auto done = __ MakeLabel<3>(MachineRepresentation::kBit);
1726
1727 // Check if {value} is a Smi.
1728 __ GotoIf(ObjectIsSmi(value), &done, zero);
1729
1730 // Check if {value} is a HeapNumber.
1731 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
1732 __ GotoUnless(__ WordEqual(value_map, __ HeapNumberMapConstant()), &done,
1733 zero);
1734
1735 // Check if {value} contains a NaN.
1736 Node* value_value = __ LoadField(AccessBuilder::ForHeapNumberValue(), value);
1737 __ Goto(&done,
1738 __ Word32Equal(__ Float64Equal(value_value, value_value), zero));
1739
1740 __ Bind(&done);
1741 return done.PhiAt(0);
1742 }
1743
1718 Node* EffectControlLinearizer::LowerObjectIsNonCallable(Node* node) { 1744 Node* EffectControlLinearizer::LowerObjectIsNonCallable(Node* node) {
1719 Node* value = node->InputAt(0); 1745 Node* value = node->InputAt(0);
1720 1746
1721 auto if_primitive = __ MakeDeferredLabel<2>(); 1747 auto if_primitive = __ MakeDeferredLabel<2>();
1722 auto done = __ MakeLabel<2>(MachineRepresentation::kBit); 1748 auto done = __ MakeLabel<2>(MachineRepresentation::kBit);
1723 1749
1724 Node* check0 = ObjectIsSmi(value); 1750 Node* check0 = ObjectIsSmi(value);
1725 __ GotoIf(check0, &if_primitive); 1751 __ GotoIf(check0, &if_primitive);
1726 1752
1727 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value); 1753 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
(...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after
2787 return isolate()->factory(); 2813 return isolate()->factory();
2788 } 2814 }
2789 2815
2790 Isolate* EffectControlLinearizer::isolate() const { 2816 Isolate* EffectControlLinearizer::isolate() const {
2791 return jsgraph()->isolate(); 2817 return jsgraph()->isolate();
2792 } 2818 }
2793 2819
2794 } // namespace compiler 2820 } // namespace compiler
2795 } // namespace internal 2821 } // namespace internal
2796 } // namespace v8 2822 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698