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

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

Issue 2722483003: [turbofan] Introduce dedicated ObjectIsNaN operator. (Closed)
Patch Set: Use GetUpperBound. Add test cases. 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
« no previous file with comments | « src/compiler/effect-control-linearizer.h ('k') | src/compiler/js-builtin-reducer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 702 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 break; 713 break;
714 case IrOpcode::kTruncateTaggedToWord32: 714 case IrOpcode::kTruncateTaggedToWord32:
715 result = LowerTruncateTaggedToWord32(node); 715 result = LowerTruncateTaggedToWord32(node);
716 break; 716 break;
717 case IrOpcode::kCheckedTruncateTaggedToWord32: 717 case IrOpcode::kCheckedTruncateTaggedToWord32:
718 result = LowerCheckedTruncateTaggedToWord32(node, frame_state); 718 result = LowerCheckedTruncateTaggedToWord32(node, frame_state);
719 break; 719 break;
720 case IrOpcode::kObjectIsDetectableCallable: 720 case IrOpcode::kObjectIsDetectableCallable:
721 result = LowerObjectIsDetectableCallable(node); 721 result = LowerObjectIsDetectableCallable(node);
722 break; 722 break;
723 case IrOpcode::kObjectIsNaN:
724 result = LowerObjectIsNaN(node);
725 break;
723 case IrOpcode::kObjectIsNonCallable: 726 case IrOpcode::kObjectIsNonCallable:
724 result = LowerObjectIsNonCallable(node); 727 result = LowerObjectIsNonCallable(node);
725 break; 728 break;
726 case IrOpcode::kObjectIsNumber: 729 case IrOpcode::kObjectIsNumber:
727 result = LowerObjectIsNumber(node); 730 result = LowerObjectIsNumber(node);
728 break; 731 break;
729 case IrOpcode::kObjectIsReceiver: 732 case IrOpcode::kObjectIsReceiver:
730 result = LowerObjectIsReceiver(node); 733 result = LowerObjectIsReceiver(node);
731 break; 734 break;
732 case IrOpcode::kObjectIsSmi: 735 case IrOpcode::kObjectIsSmi:
(...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 (1 << Map::kIsUndetectable)))); 1713 (1 << Map::kIsUndetectable))));
1711 __ Goto(&done, vfalse); 1714 __ Goto(&done, vfalse);
1712 1715
1713 __ Bind(&if_smi); 1716 __ Bind(&if_smi);
1714 __ Goto(&done, __ Int32Constant(0)); 1717 __ Goto(&done, __ Int32Constant(0));
1715 1718
1716 __ Bind(&done); 1719 __ Bind(&done);
1717 return done.PhiAt(0); 1720 return done.PhiAt(0);
1718 } 1721 }
1719 1722
1723 Node* EffectControlLinearizer::LowerObjectIsNaN(Node* node) {
1724 Node* value = node->InputAt(0);
1725 Node* zero = __ Int32Constant(0);
1726
1727 auto done = __ MakeLabel<3>(MachineRepresentation::kBit);
1728
1729 // Check if {value} is a Smi.
1730 __ GotoIf(ObjectIsSmi(value), &done, zero);
1731
1732 // Check if {value} is a HeapNumber.
1733 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
1734 __ GotoUnless(__ WordEqual(value_map, __ HeapNumberMapConstant()), &done,
1735 zero);
1736
1737 // Check if {value} contains a NaN.
1738 Node* value_value = __ LoadField(AccessBuilder::ForHeapNumberValue(), value);
1739 __ Goto(&done,
1740 __ Word32Equal(__ Float64Equal(value_value, value_value), zero));
1741
1742 __ Bind(&done);
1743 return done.PhiAt(0);
1744 }
1745
1720 Node* EffectControlLinearizer::LowerObjectIsNonCallable(Node* node) { 1746 Node* EffectControlLinearizer::LowerObjectIsNonCallable(Node* node) {
1721 Node* value = node->InputAt(0); 1747 Node* value = node->InputAt(0);
1722 1748
1723 auto if_primitive = __ MakeDeferredLabel<2>(); 1749 auto if_primitive = __ MakeDeferredLabel<2>();
1724 auto done = __ MakeLabel<2>(MachineRepresentation::kBit); 1750 auto done = __ MakeLabel<2>(MachineRepresentation::kBit);
1725 1751
1726 Node* check0 = ObjectIsSmi(value); 1752 Node* check0 = ObjectIsSmi(value);
1727 __ GotoIf(check0, &if_primitive); 1753 __ GotoIf(check0, &if_primitive);
1728 1754
1729 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value); 1755 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
(...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after
2850 return isolate()->factory(); 2876 return isolate()->factory();
2851 } 2877 }
2852 2878
2853 Isolate* EffectControlLinearizer::isolate() const { 2879 Isolate* EffectControlLinearizer::isolate() const {
2854 return jsgraph()->isolate(); 2880 return jsgraph()->isolate();
2855 } 2881 }
2856 2882
2857 } // namespace compiler 2883 } // namespace compiler
2858 } // namespace internal 2884 } // namespace internal
2859 } // namespace v8 2885 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/effect-control-linearizer.h ('k') | src/compiler/js-builtin-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698