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

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

Issue 2231963002: [turbofan] Avoid unnecessary minus zero checks for Float64->Tagged. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE Created 4 years, 4 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 | « no previous file | src/compiler/representation-change.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/js-graph.h" 9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/linkage.h" 10 #include "src/compiler/linkage.h"
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 } 755 }
756 NodeProperties::ReplaceUses(node, state.value, state.effect, state.control); 756 NodeProperties::ReplaceUses(node, state.value, state.effect, state.control);
757 *effect = state.effect; 757 *effect = state.effect;
758 *control = state.control; 758 *control = state.control;
759 return true; 759 return true;
760 } 760 }
761 761
762 EffectControlLinearizer::ValueEffectControl 762 EffectControlLinearizer::ValueEffectControl
763 EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect, 763 EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect,
764 Node* control) { 764 Node* control) {
765 CheckForMinusZeroMode mode = CheckMinusZeroModeOf(node->op());
765 Node* value = node->InputAt(0); 766 Node* value = node->InputAt(0);
766 767
767 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value); 768 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value);
768 Node* check_same = graph()->NewNode( 769 Node* check_same = graph()->NewNode(
769 machine()->Float64Equal(), value, 770 machine()->Float64Equal(), value,
770 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); 771 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32));
771 Node* branch_same = graph()->NewNode(common()->Branch(), check_same, control); 772 Node* branch_same = graph()->NewNode(common()->Branch(), check_same, control);
772 773
773 Node* if_smi = graph()->NewNode(common()->IfTrue(), branch_same); 774 Node* if_smi = graph()->NewNode(common()->IfTrue(), branch_same);
774 Node* vsmi; 775 Node* vsmi;
775 Node* if_box = graph()->NewNode(common()->IfFalse(), branch_same); 776 Node* if_box = graph()->NewNode(common()->IfFalse(), branch_same);
776 777
777 // Check if {value} is -0. 778 if (mode == CheckForMinusZeroMode::kCheckForMinusZero) {
778 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32, 779 // Check if {value} is -0.
779 jsgraph()->Int32Constant(0)); 780 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32,
780 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse), 781 jsgraph()->Int32Constant(0));
781 check_zero, if_smi); 782 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse),
783 check_zero, if_smi);
782 784
783 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero); 785 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero);
784 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero); 786 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero);
785 787
786 // In case of 0, we need to check the high bits for the IEEE -0 pattern. 788 // In case of 0, we need to check the high bits for the IEEE -0 pattern.
787 Node* check_negative = graph()->NewNode( 789 Node* check_negative = graph()->NewNode(
788 machine()->Int32LessThan(), 790 machine()->Int32LessThan(),
789 graph()->NewNode(machine()->Float64ExtractHighWord32(), value), 791 graph()->NewNode(machine()->Float64ExtractHighWord32(), value),
790 jsgraph()->Int32Constant(0)); 792 jsgraph()->Int32Constant(0));
791 Node* branch_negative = graph()->NewNode(common()->Branch(BranchHint::kFalse), 793 Node* branch_negative = graph()->NewNode(
792 check_negative, if_zero); 794 common()->Branch(BranchHint::kFalse), check_negative, if_zero);
793 795
794 Node* if_negative = graph()->NewNode(common()->IfTrue(), branch_negative); 796 Node* if_negative = graph()->NewNode(common()->IfTrue(), branch_negative);
795 Node* if_notnegative = graph()->NewNode(common()->IfFalse(), branch_negative); 797 Node* if_notnegative =
798 graph()->NewNode(common()->IfFalse(), branch_negative);
796 799
797 // We need to create a box for negative 0. 800 // We need to create a box for negative 0.
798 if_smi = graph()->NewNode(common()->Merge(2), if_notzero, if_notnegative); 801 if_smi = graph()->NewNode(common()->Merge(2), if_notzero, if_notnegative);
799 if_box = graph()->NewNode(common()->Merge(2), if_box, if_negative); 802 if_box = graph()->NewNode(common()->Merge(2), if_box, if_negative);
803 }
800 804
801 // On 64-bit machines we can just wrap the 32-bit integer in a smi, for 32-bit 805 // On 64-bit machines we can just wrap the 32-bit integer in a smi, for 32-bit
802 // machines we need to deal with potential overflow and fallback to boxing. 806 // machines we need to deal with potential overflow and fallback to boxing.
803 if (machine()->Is64()) { 807 if (machine()->Is64()) {
804 vsmi = ChangeInt32ToSmi(value32); 808 vsmi = ChangeInt32ToSmi(value32);
805 } else { 809 } else {
806 Node* smi_tag = graph()->NewNode(machine()->Int32AddWithOverflow(), value32, 810 Node* smi_tag = graph()->NewNode(machine()->Int32AddWithOverflow(), value32,
807 value32, if_smi); 811 value32, if_smi);
808 812
809 Node* check_ovf = 813 Node* check_ovf =
(...skipping 2495 matching lines...) Expand 10 before | Expand all | Expand 10 after
3305 isolate(), graph()->zone(), callable.descriptor(), 0, flags, 3309 isolate(), graph()->zone(), callable.descriptor(), 0, flags,
3306 Operator::kNoThrow); 3310 Operator::kNoThrow);
3307 to_number_operator_.set(common()->Call(desc)); 3311 to_number_operator_.set(common()->Call(desc));
3308 } 3312 }
3309 return to_number_operator_.get(); 3313 return to_number_operator_.get();
3310 } 3314 }
3311 3315
3312 } // namespace compiler 3316 } // namespace compiler
3313 } // namespace internal 3317 } // namespace internal
3314 } // namespace v8 3318 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/representation-change.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698