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/instruction-selector-impl.h" | 5 #include "src/compiler/instruction-selector-impl.h" |
6 #include "src/compiler/node-matchers.h" | 6 #include "src/compiler/node-matchers.h" |
7 #include "src/compiler/node-properties-inl.h" | 7 #include "src/compiler/node-properties-inl.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 Node* left, Node* right, FlagsContinuation* cont, | 792 Node* left, Node* right, FlagsContinuation* cont, |
793 bool commutative) { | 793 bool commutative) { |
794 IA32OperandGenerator g(selector); | 794 IA32OperandGenerator g(selector); |
795 if (commutative && g.CanBeBetterLeftOperand(right)) { | 795 if (commutative && g.CanBeBetterLeftOperand(right)) { |
796 std::swap(left, right); | 796 std::swap(left, right); |
797 } | 797 } |
798 VisitCompare(selector, opcode, g.UseRegister(left), g.Use(right), cont); | 798 VisitCompare(selector, opcode, g.UseRegister(left), g.Use(right), cont); |
799 } | 799 } |
800 | 800 |
801 | 801 |
802 // Shared routine for multiple float compare operations. | 802 // Shared routine for multiple float64 compare operations (inputs commuted). |
803 void VisitFloat64Compare(InstructionSelector* selector, Node* node, | 803 void VisitFloat64Compare(InstructionSelector* selector, Node* node, |
804 FlagsContinuation* cont) { | 804 FlagsContinuation* cont) { |
805 VisitCompare(selector, kSSEFloat64Cmp, node->InputAt(0), node->InputAt(1), | 805 Node* const left = node->InputAt(0); |
806 cont, node->op()->HasProperty(Operator::kCommutative)); | 806 Node* const right = node->InputAt(1); |
| 807 VisitCompare(selector, kSSEFloat64Cmp, right, left, cont, false); |
807 } | 808 } |
808 | 809 |
809 | 810 |
810 // Shared routine for multiple word compare operations. | 811 // Shared routine for multiple word compare operations. |
811 void VisitWordCompare(InstructionSelector* selector, Node* node, | 812 void VisitWordCompare(InstructionSelector* selector, Node* node, |
812 InstructionCode opcode, FlagsContinuation* cont) { | 813 InstructionCode opcode, FlagsContinuation* cont) { |
813 IA32OperandGenerator g(selector); | 814 IA32OperandGenerator g(selector); |
814 Node* const left = node->InputAt(0); | 815 Node* const left = node->InputAt(0); |
815 Node* const right = node->InputAt(1); | 816 Node* const right = node->InputAt(1); |
816 | 817 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 case IrOpcode::kUint32LessThan: | 862 case IrOpcode::kUint32LessThan: |
862 cont->OverwriteAndNegateIfEqual(kUnsignedLessThan); | 863 cont->OverwriteAndNegateIfEqual(kUnsignedLessThan); |
863 return VisitWordCompare(selector, value, cont); | 864 return VisitWordCompare(selector, value, cont); |
864 case IrOpcode::kUint32LessThanOrEqual: | 865 case IrOpcode::kUint32LessThanOrEqual: |
865 cont->OverwriteAndNegateIfEqual(kUnsignedLessThanOrEqual); | 866 cont->OverwriteAndNegateIfEqual(kUnsignedLessThanOrEqual); |
866 return VisitWordCompare(selector, value, cont); | 867 return VisitWordCompare(selector, value, cont); |
867 case IrOpcode::kFloat64Equal: | 868 case IrOpcode::kFloat64Equal: |
868 cont->OverwriteAndNegateIfEqual(kUnorderedEqual); | 869 cont->OverwriteAndNegateIfEqual(kUnorderedEqual); |
869 return VisitFloat64Compare(selector, value, cont); | 870 return VisitFloat64Compare(selector, value, cont); |
870 case IrOpcode::kFloat64LessThan: | 871 case IrOpcode::kFloat64LessThan: |
871 cont->OverwriteAndNegateIfEqual(kUnorderedLessThan); | 872 cont->OverwriteAndNegateIfEqual(kUnsignedGreaterThan); |
872 return VisitFloat64Compare(selector, value, cont); | 873 return VisitFloat64Compare(selector, value, cont); |
873 case IrOpcode::kFloat64LessThanOrEqual: | 874 case IrOpcode::kFloat64LessThanOrEqual: |
874 cont->OverwriteAndNegateIfEqual(kUnorderedLessThanOrEqual); | 875 cont->OverwriteAndNegateIfEqual(kUnsignedGreaterThanOrEqual); |
875 return VisitFloat64Compare(selector, value, cont); | 876 return VisitFloat64Compare(selector, value, cont); |
876 case IrOpcode::kProjection: | 877 case IrOpcode::kProjection: |
877 // Check if this is the overflow output projection of an | 878 // Check if this is the overflow output projection of an |
878 // <Operation>WithOverflow node. | 879 // <Operation>WithOverflow node. |
879 if (OpParameter<size_t>(value) == 1u) { | 880 if (OpParameter<size_t>(value) == 1u) { |
880 // We cannot combine the <Operation>WithOverflow with this branch | 881 // We cannot combine the <Operation>WithOverflow with this branch |
881 // unless the 0th projection (the use of the actual value of the | 882 // unless the 0th projection (the use of the actual value of the |
882 // <Operation> is either NULL, which means there's no use of the | 883 // <Operation> is either NULL, which means there's no use of the |
883 // actual value, or was already defined, which means it is scheduled | 884 // actual value, or was already defined, which means it is scheduled |
884 // *AFTER* this branch). | 885 // *AFTER* this branch). |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 } | 978 } |
978 | 979 |
979 | 980 |
980 void InstructionSelector::VisitFloat64Equal(Node* node) { | 981 void InstructionSelector::VisitFloat64Equal(Node* node) { |
981 FlagsContinuation cont(kUnorderedEqual, node); | 982 FlagsContinuation cont(kUnorderedEqual, node); |
982 VisitFloat64Compare(this, node, &cont); | 983 VisitFloat64Compare(this, node, &cont); |
983 } | 984 } |
984 | 985 |
985 | 986 |
986 void InstructionSelector::VisitFloat64LessThan(Node* node) { | 987 void InstructionSelector::VisitFloat64LessThan(Node* node) { |
987 FlagsContinuation cont(kUnorderedLessThan, node); | 988 FlagsContinuation cont(kUnsignedGreaterThan, node); |
988 VisitFloat64Compare(this, node, &cont); | 989 VisitFloat64Compare(this, node, &cont); |
989 } | 990 } |
990 | 991 |
991 | 992 |
992 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { | 993 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { |
993 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); | 994 FlagsContinuation cont(kUnsignedGreaterThanOrEqual, node); |
994 VisitFloat64Compare(this, node, &cont); | 995 VisitFloat64Compare(this, node, &cont); |
995 } | 996 } |
996 | 997 |
997 | 998 |
998 // static | 999 // static |
999 MachineOperatorBuilder::Flags | 1000 MachineOperatorBuilder::Flags |
1000 InstructionSelector::SupportedMachineOperatorFlags() { | 1001 InstructionSelector::SupportedMachineOperatorFlags() { |
1001 if (CpuFeatures::IsSupported(SSE4_1)) { | 1002 if (CpuFeatures::IsSupported(SSE4_1)) { |
1002 return MachineOperatorBuilder::kFloat64Floor | | 1003 return MachineOperatorBuilder::kFloat64Floor | |
1003 MachineOperatorBuilder::kFloat64Ceil | | 1004 MachineOperatorBuilder::kFloat64Ceil | |
1004 MachineOperatorBuilder::kFloat64RoundTruncate | | 1005 MachineOperatorBuilder::kFloat64RoundTruncate | |
1005 MachineOperatorBuilder::kWord32ShiftIsSafe; | 1006 MachineOperatorBuilder::kWord32ShiftIsSafe; |
1006 } | 1007 } |
1007 return MachineOperatorBuilder::Flag::kNoFlags; | 1008 return MachineOperatorBuilder::Flag::kNoFlags; |
1008 } | 1009 } |
| 1010 |
1009 } // namespace compiler | 1011 } // namespace compiler |
1010 } // namespace internal | 1012 } // namespace internal |
1011 } // namespace v8 | 1013 } // namespace v8 |
OLD | NEW |