OLD | NEW |
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 767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 } | 778 } |
779 NodeProperties::ReplaceUses(node, state.value, state.effect, state.control); | 779 NodeProperties::ReplaceUses(node, state.value, state.effect, state.control); |
780 *effect = state.effect; | 780 *effect = state.effect; |
781 *control = state.control; | 781 *control = state.control; |
782 return true; | 782 return true; |
783 } | 783 } |
784 | 784 |
785 EffectControlLinearizer::ValueEffectControl | 785 EffectControlLinearizer::ValueEffectControl |
786 EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect, | 786 EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect, |
787 Node* control) { | 787 Node* control) { |
788 CheckForMinusZeroMode mode = CheckMinusZeroModeOf(node->op()); | |
789 Node* value = node->InputAt(0); | 788 Node* value = node->InputAt(0); |
790 | 789 return AllocateHeapNumberWithValue(value, effect, control); |
791 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value); | |
792 Node* check_same = graph()->NewNode( | |
793 machine()->Float64Equal(), value, | |
794 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); | |
795 Node* branch_same = graph()->NewNode(common()->Branch(), check_same, control); | |
796 | |
797 Node* if_smi = graph()->NewNode(common()->IfTrue(), branch_same); | |
798 Node* vsmi; | |
799 Node* if_box = graph()->NewNode(common()->IfFalse(), branch_same); | |
800 | |
801 if (mode == CheckForMinusZeroMode::kCheckForMinusZero) { | |
802 // Check if {value} is -0. | |
803 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32, | |
804 jsgraph()->Int32Constant(0)); | |
805 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse), | |
806 check_zero, if_smi); | |
807 | |
808 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero); | |
809 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero); | |
810 | |
811 // In case of 0, we need to check the high bits for the IEEE -0 pattern. | |
812 Node* check_negative = graph()->NewNode( | |
813 machine()->Int32LessThan(), | |
814 graph()->NewNode(machine()->Float64ExtractHighWord32(), value), | |
815 jsgraph()->Int32Constant(0)); | |
816 Node* branch_negative = graph()->NewNode( | |
817 common()->Branch(BranchHint::kFalse), check_negative, if_zero); | |
818 | |
819 Node* if_negative = graph()->NewNode(common()->IfTrue(), branch_negative); | |
820 Node* if_notnegative = | |
821 graph()->NewNode(common()->IfFalse(), branch_negative); | |
822 | |
823 // We need to create a box for negative 0. | |
824 if_smi = graph()->NewNode(common()->Merge(2), if_notzero, if_notnegative); | |
825 if_box = graph()->NewNode(common()->Merge(2), if_box, if_negative); | |
826 } | |
827 | |
828 // On 64-bit machines we can just wrap the 32-bit integer in a smi, for 32-bit | |
829 // machines we need to deal with potential overflow and fallback to boxing. | |
830 if (machine()->Is64()) { | |
831 vsmi = ChangeInt32ToSmi(value32); | |
832 } else { | |
833 Node* smi_tag = graph()->NewNode(machine()->Int32AddWithOverflow(), value32, | |
834 value32, if_smi); | |
835 | |
836 Node* check_ovf = | |
837 graph()->NewNode(common()->Projection(1), smi_tag, if_smi); | |
838 Node* branch_ovf = graph()->NewNode(common()->Branch(BranchHint::kFalse), | |
839 check_ovf, if_smi); | |
840 | |
841 Node* if_ovf = graph()->NewNode(common()->IfTrue(), branch_ovf); | |
842 if_box = graph()->NewNode(common()->Merge(2), if_ovf, if_box); | |
843 | |
844 if_smi = graph()->NewNode(common()->IfFalse(), branch_ovf); | |
845 vsmi = graph()->NewNode(common()->Projection(0), smi_tag, if_smi); | |
846 } | |
847 | |
848 // Allocate the box for the {value}. | |
849 ValueEffectControl box = AllocateHeapNumberWithValue(value, effect, if_box); | |
850 | |
851 control = graph()->NewNode(common()->Merge(2), if_smi, box.control); | |
852 value = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | |
853 vsmi, box.value, control); | |
854 effect = | |
855 graph()->NewNode(common()->EffectPhi(2), effect, box.effect, control); | |
856 return ValueEffectControl(value, effect, control); | |
857 } | 790 } |
858 | 791 |
859 EffectControlLinearizer::ValueEffectControl | 792 EffectControlLinearizer::ValueEffectControl |
860 EffectControlLinearizer::LowerChangeBitToTagged(Node* node, Node* effect, | 793 EffectControlLinearizer::LowerChangeBitToTagged(Node* node, Node* effect, |
861 Node* control) { | 794 Node* control) { |
862 Node* value = node->InputAt(0); | 795 Node* value = node->InputAt(0); |
863 | 796 |
864 Node* branch = graph()->NewNode(common()->Branch(), value, control); | 797 Node* branch = graph()->NewNode(common()->Branch(), value, control); |
865 | 798 |
866 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 799 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
(...skipping 2688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3555 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3488 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3556 Operator::kEliminatable); | 3489 Operator::kEliminatable); |
3557 to_number_operator_.set(common()->Call(desc)); | 3490 to_number_operator_.set(common()->Call(desc)); |
3558 } | 3491 } |
3559 return to_number_operator_.get(); | 3492 return to_number_operator_.get(); |
3560 } | 3493 } |
3561 | 3494 |
3562 } // namespace compiler | 3495 } // namespace compiler |
3563 } // namespace internal | 3496 } // namespace internal |
3564 } // namespace v8 | 3497 } // namespace v8 |
OLD | NEW |