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

Side by Side Diff: src/compiler/ia32/instruction-selector-ia32.cc

Issue 2669683002: [Turbofan] Macro-ize instruction selection for ia32. (Closed)
Patch Set: Created 3 years, 10 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 | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/compiler/instruction-selector-impl.h" 6 #include "src/compiler/instruction-selector-impl.h"
7 #include "src/compiler/node-matchers.h" 7 #include "src/compiler/node-matchers.h"
8 #include "src/compiler/node-properties.h" 8 #include "src/compiler/node-properties.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 } 764 }
765 765
766 void InstructionSelector::VisitWord32PairSar(Node* node) { 766 void InstructionSelector::VisitWord32PairSar(Node* node) {
767 VisitWord32PairShift(this, kIA32SarPair, node); 767 VisitWord32PairShift(this, kIA32SarPair, node);
768 } 768 }
769 769
770 void InstructionSelector::VisitWord32Ror(Node* node) { 770 void InstructionSelector::VisitWord32Ror(Node* node) {
771 VisitShift(this, node, kIA32Ror); 771 VisitShift(this, node, kIA32Ror);
772 } 772 }
773 773
774 #define RO_OP_LIST(V) \
775 V(Word32Clz, kIA32Lzcnt) \
776 V(Word32Ctz, kIA32Tzcnt) \
777 V(Word32Popcnt, kIA32Popcnt) \
778 V(ChangeFloat32ToFloat64, kSSEFloat32ToFloat64) \
779 V(RoundInt32ToFloat32, kSSEInt32ToFloat32) \
780 V(ChangeInt32ToFloat64, kSSEInt32ToFloat64) \
781 V(ChangeUint32ToFloat64, kSSEUint32ToFloat64) \
782 V(TruncateFloat32ToInt32, kSSEFloat32ToInt32) \
783 V(TruncateFloat32ToUint32, kSSEFloat32ToUint32) \
784 V(ChangeFloat64ToInt32, kSSEFloat64ToInt32) \
785 V(ChangeFloat64ToUint32, kSSEFloat64ToUint32) \
786 V(TruncateFloat64ToUint32, kSSEFloat64ToUint32) \
787 V(TruncateFloat64ToFloat32, kSSEFloat64ToFloat32) \
788 V(RoundFloat64ToInt32, kSSEFloat64ToInt32) \
789 V(BitcastFloat32ToInt32, kIA32BitcastFI) \
790 V(BitcastInt32ToFloat32, kIA32BitcastIF) \
791 V(Float32Sqrt, kSSEFloat32Sqrt) \
792 V(Float64Sqrt, kSSEFloat64Sqrt) \
793 V(Float64ExtractLowWord32, kSSEFloat64ExtractLowWord32) \
794 V(Float64ExtractHighWord32, kSSEFloat64ExtractHighWord32)
774 795
775 void InstructionSelector::VisitWord32Clz(Node* node) { 796 #define RR_OP_LIST(V) \
776 IA32OperandGenerator g(this); 797 V(TruncateFloat64ToWord32, kArchTruncateDoubleToI) \
777 Emit(kIA32Lzcnt, g.DefineAsRegister(node), g.Use(node->InputAt(0))); 798 V(Float32RoundDown, kSSEFloat32Round | MiscField::encode(kRoundDown)) \
778 } 799 V(Float64RoundDown, kSSEFloat64Round | MiscField::encode(kRoundDown)) \
800 V(Float32RoundUp, kSSEFloat32Round | MiscField::encode(kRoundUp)) \
801 V(Float64RoundUp, kSSEFloat64Round | MiscField::encode(kRoundUp)) \
802 V(Float32RoundTruncate, kSSEFloat32Round | MiscField::encode(kRoundToZero)) \
803 V(Float64RoundTruncate, kSSEFloat64Round | MiscField::encode(kRoundToZero)) \
804 V(Float32RoundTiesEven, \
805 kSSEFloat32Round | MiscField::encode(kRoundToNearest)) \
806 V(Float64RoundTiesEven, kSSEFloat64Round | MiscField::encode(kRoundToNearest))
779 807
808 #define RRO_FLOAT_OP_LIST(V) \
809 V(Float32Add, kAVXFloat32Add, kSSEFloat32Add) \
810 V(Float64Add, kAVXFloat64Add, kSSEFloat64Add) \
811 V(Float32Sub, kAVXFloat32Sub, kSSEFloat32Sub) \
812 V(Float64Sub, kAVXFloat64Sub, kSSEFloat64Sub) \
813 V(Float32Mul, kAVXFloat32Mul, kSSEFloat32Mul) \
814 V(Float64Mul, kAVXFloat64Mul, kSSEFloat64Mul) \
815 V(Float32Div, kAVXFloat32Div, kSSEFloat32Div) \
816 V(Float64Div, kAVXFloat64Div, kSSEFloat64Div)
780 817
781 void InstructionSelector::VisitWord32Ctz(Node* node) { 818 #define FLOAT_UNOP_LIST(V) \
782 IA32OperandGenerator g(this); 819 V(Float32Abs, kAVXFloat32Abs, kSSEFloat32Abs) \
783 Emit(kIA32Tzcnt, g.DefineAsRegister(node), g.Use(node->InputAt(0))); 820 V(Float64Abs, kAVXFloat64Abs, kSSEFloat64Abs) \
784 } 821 V(Float32Neg, kAVXFloat32Neg, kSSEFloat32Neg) \
822 V(Float64Neg, kAVXFloat64Neg, kSSEFloat64Neg)
785 823
824 #define RO_VISITOR(Name, opcode) \
825 void InstructionSelector::Visit##Name(Node* node) { \
826 VisitRO(this, node, opcode); \
827 }
828 RO_OP_LIST(RO_VISITOR)
829 #undef RO_VISITOR
830
831 #define RR_VISITOR(Name, opcode) \
832 void InstructionSelector::Visit##Name(Node* node) { \
833 VisitRR(this, node, opcode); \
834 }
835 RR_OP_LIST(RR_VISITOR)
836 #undef RR_VISITOR
837
838 #define RRO_FLOAT_VISITOR(Name, avx, sse) \
839 void InstructionSelector::Visit##Name(Node* node) { \
840 VisitRROFloat(this, node, avx, sse); \
841 }
842 RRO_FLOAT_OP_LIST(RRO_FLOAT_VISITOR)
843 #undef RRO_FLOAT_VISITOR
844
845 #define FLOAT_UNOP_VISITOR(Name, avx, sse) \
846 void InstructionSelector::Visit##Name(Node* node) { \
847 VisitFloatUnop(this, node, node->InputAt(0), avx, sse); \
848 }
849 FLOAT_UNOP_LIST(FLOAT_UNOP_VISITOR)
850 #undef FLOAT_UNOP_VISITOR
786 851
787 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } 852 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); }
788 853
789 void InstructionSelector::VisitWord64ReverseBytes(Node* node) { UNREACHABLE(); } 854 void InstructionSelector::VisitWord64ReverseBytes(Node* node) { UNREACHABLE(); }
790 855
791 void InstructionSelector::VisitWord32ReverseBytes(Node* node) { UNREACHABLE(); } 856 void InstructionSelector::VisitWord32ReverseBytes(Node* node) { UNREACHABLE(); }
792 857
793 void InstructionSelector::VisitWord32Popcnt(Node* node) {
794 IA32OperandGenerator g(this);
795 Emit(kIA32Popcnt, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
796 }
797
798
799 void InstructionSelector::VisitInt32Add(Node* node) { 858 void InstructionSelector::VisitInt32Add(Node* node) {
800 IA32OperandGenerator g(this); 859 IA32OperandGenerator g(this);
801 860
802 // Try to match the Add to a lea pattern 861 // Try to match the Add to a lea pattern
803 BaseWithIndexAndDisplacement32Matcher m(node); 862 BaseWithIndexAndDisplacement32Matcher m(node);
804 if (m.matches() && 863 if (m.matches() &&
805 (m.displacement() == nullptr || g.CanBeImmediate(m.displacement()))) { 864 (m.displacement() == nullptr || g.CanBeImmediate(m.displacement()))) {
806 InstructionOperand inputs[4]; 865 InstructionOperand inputs[4];
807 size_t input_count = 0; 866 size_t input_count = 0;
808 AddressingMode mode = g.GenerateMemoryOperandInputs( 867 AddressingMode mode = g.GenerateMemoryOperandInputs(
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 void InstructionSelector::VisitInt32Mod(Node* node) { 942 void InstructionSelector::VisitInt32Mod(Node* node) {
884 VisitMod(this, node, kIA32Idiv); 943 VisitMod(this, node, kIA32Idiv);
885 } 944 }
886 945
887 946
888 void InstructionSelector::VisitUint32Mod(Node* node) { 947 void InstructionSelector::VisitUint32Mod(Node* node) {
889 VisitMod(this, node, kIA32Udiv); 948 VisitMod(this, node, kIA32Udiv);
890 } 949 }
891 950
892 951
893 void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) {
894 VisitRO(this, node, kSSEFloat32ToFloat64);
895 }
896
897
898 void InstructionSelector::VisitRoundInt32ToFloat32(Node* node) {
899 VisitRO(this, node, kSSEInt32ToFloat32);
900 }
901
902
903 void InstructionSelector::VisitRoundUint32ToFloat32(Node* node) { 952 void InstructionSelector::VisitRoundUint32ToFloat32(Node* node) {
904 IA32OperandGenerator g(this); 953 IA32OperandGenerator g(this);
905 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; 954 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()};
906 Emit(kSSEUint32ToFloat32, g.DefineAsRegister(node), g.Use(node->InputAt(0)), 955 Emit(kSSEUint32ToFloat32, g.DefineAsRegister(node), g.Use(node->InputAt(0)),
907 arraysize(temps), temps); 956 arraysize(temps), temps);
908 } 957 }
909 958
910
911 void InstructionSelector::VisitChangeInt32ToFloat64(Node* node) {
912 VisitRO(this, node, kSSEInt32ToFloat64);
913 }
914
915
916 void InstructionSelector::VisitChangeUint32ToFloat64(Node* node) {
917 VisitRO(this, node, kSSEUint32ToFloat64);
918 }
919
920
921 void InstructionSelector::VisitTruncateFloat32ToInt32(Node* node) {
922 VisitRO(this, node, kSSEFloat32ToInt32);
923 }
924
925
926 void InstructionSelector::VisitTruncateFloat32ToUint32(Node* node) {
927 VisitRO(this, node, kSSEFloat32ToUint32);
928 }
929
930
931 void InstructionSelector::VisitChangeFloat64ToInt32(Node* node) {
932 VisitRO(this, node, kSSEFloat64ToInt32);
933 }
934
935
936 void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) {
937 VisitRO(this, node, kSSEFloat64ToUint32);
938 }
939
940 void InstructionSelector::VisitTruncateFloat64ToUint32(Node* node) {
941 VisitRO(this, node, kSSEFloat64ToUint32);
942 }
943
944 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) {
945 VisitRO(this, node, kSSEFloat64ToFloat32);
946 }
947
948 void InstructionSelector::VisitTruncateFloat64ToWord32(Node* node) {
949 VisitRR(this, node, kArchTruncateDoubleToI);
950 }
951
952 void InstructionSelector::VisitRoundFloat64ToInt32(Node* node) {
953 VisitRO(this, node, kSSEFloat64ToInt32);
954 }
955
956
957 void InstructionSelector::VisitBitcastFloat32ToInt32(Node* node) {
958 IA32OperandGenerator g(this);
959 Emit(kIA32BitcastFI, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
960 }
961
962
963 void InstructionSelector::VisitBitcastInt32ToFloat32(Node* node) {
964 IA32OperandGenerator g(this);
965 Emit(kIA32BitcastIF, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
966 }
967
968
969 void InstructionSelector::VisitFloat32Add(Node* node) {
970 VisitRROFloat(this, node, kAVXFloat32Add, kSSEFloat32Add);
971 }
972
973
974 void InstructionSelector::VisitFloat64Add(Node* node) {
975 VisitRROFloat(this, node, kAVXFloat64Add, kSSEFloat64Add);
976 }
977
978
979 void InstructionSelector::VisitFloat32Sub(Node* node) {
980 VisitRROFloat(this, node, kAVXFloat32Sub, kSSEFloat32Sub);
981 }
982
983 void InstructionSelector::VisitFloat64Sub(Node* node) {
984 VisitRROFloat(this, node, kAVXFloat64Sub, kSSEFloat64Sub);
985 }
986
987 void InstructionSelector::VisitFloat32Mul(Node* node) {
988 VisitRROFloat(this, node, kAVXFloat32Mul, kSSEFloat32Mul);
989 }
990
991
992 void InstructionSelector::VisitFloat64Mul(Node* node) {
993 VisitRROFloat(this, node, kAVXFloat64Mul, kSSEFloat64Mul);
994 }
995
996
997 void InstructionSelector::VisitFloat32Div(Node* node) {
998 VisitRROFloat(this, node, kAVXFloat32Div, kSSEFloat32Div);
999 }
1000
1001
1002 void InstructionSelector::VisitFloat64Div(Node* node) {
1003 VisitRROFloat(this, node, kAVXFloat64Div, kSSEFloat64Div);
1004 }
1005
1006
1007 void InstructionSelector::VisitFloat64Mod(Node* node) { 959 void InstructionSelector::VisitFloat64Mod(Node* node) {
1008 IA32OperandGenerator g(this); 960 IA32OperandGenerator g(this);
1009 InstructionOperand temps[] = {g.TempRegister(eax)}; 961 InstructionOperand temps[] = {g.TempRegister(eax)};
1010 Emit(kSSEFloat64Mod, g.DefineSameAsFirst(node), 962 Emit(kSSEFloat64Mod, g.DefineSameAsFirst(node),
1011 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), 1, 963 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), 1,
1012 temps); 964 temps);
1013 } 965 }
1014 966
1015 void InstructionSelector::VisitFloat32Max(Node* node) { 967 void InstructionSelector::VisitFloat32Max(Node* node) {
1016 IA32OperandGenerator g(this); 968 IA32OperandGenerator g(this);
(...skipping 20 matching lines...) Expand all
1037 } 989 }
1038 990
1039 void InstructionSelector::VisitFloat64Min(Node* node) { 991 void InstructionSelector::VisitFloat64Min(Node* node) {
1040 IA32OperandGenerator g(this); 992 IA32OperandGenerator g(this);
1041 InstructionOperand temps[] = {g.TempRegister()}; 993 InstructionOperand temps[] = {g.TempRegister()};
1042 Emit(kSSEFloat64Min, g.DefineSameAsFirst(node), 994 Emit(kSSEFloat64Min, g.DefineSameAsFirst(node),
1043 g.UseRegister(node->InputAt(0)), g.Use(node->InputAt(1)), 995 g.UseRegister(node->InputAt(0)), g.Use(node->InputAt(1)),
1044 arraysize(temps), temps); 996 arraysize(temps), temps);
1045 } 997 }
1046 998
1047
1048 void InstructionSelector::VisitFloat32Abs(Node* node) {
1049 IA32OperandGenerator g(this);
1050 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat32Abs, kSSEFloat32Abs);
1051 }
1052
1053
1054 void InstructionSelector::VisitFloat64Abs(Node* node) {
1055 IA32OperandGenerator g(this);
1056 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat64Abs, kSSEFloat64Abs);
1057 }
1058
1059 void InstructionSelector::VisitFloat32Sqrt(Node* node) {
1060 VisitRO(this, node, kSSEFloat32Sqrt);
1061 }
1062
1063
1064 void InstructionSelector::VisitFloat64Sqrt(Node* node) {
1065 VisitRO(this, node, kSSEFloat64Sqrt);
1066 }
1067
1068
1069 void InstructionSelector::VisitFloat32RoundDown(Node* node) {
1070 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundDown));
1071 }
1072
1073
1074 void InstructionSelector::VisitFloat64RoundDown(Node* node) {
1075 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundDown));
1076 }
1077
1078
1079 void InstructionSelector::VisitFloat32RoundUp(Node* node) {
1080 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundUp));
1081 }
1082
1083
1084 void InstructionSelector::VisitFloat64RoundUp(Node* node) {
1085 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundUp));
1086 }
1087
1088
1089 void InstructionSelector::VisitFloat32RoundTruncate(Node* node) {
1090 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToZero));
1091 }
1092
1093
1094 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) {
1095 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToZero));
1096 }
1097
1098
1099 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { 999 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) {
1100 UNREACHABLE(); 1000 UNREACHABLE();
1101 } 1001 }
1102 1002
1103
1104 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) {
1105 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToNearest));
1106 }
1107
1108
1109 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) {
1110 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToNearest));
1111 }
1112
1113 void InstructionSelector::VisitFloat32Neg(Node* node) {
1114 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat32Neg, kSSEFloat32Neg);
1115 }
1116
1117 void InstructionSelector::VisitFloat64Neg(Node* node) {
1118 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat64Neg, kSSEFloat64Neg);
1119 }
1120
1121 void InstructionSelector::VisitFloat64Ieee754Binop(Node* node, 1003 void InstructionSelector::VisitFloat64Ieee754Binop(Node* node,
1122 InstructionCode opcode) { 1004 InstructionCode opcode) {
1123 IA32OperandGenerator g(this); 1005 IA32OperandGenerator g(this);
1124 Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)), 1006 Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)),
1125 g.UseRegister(node->InputAt(1))) 1007 g.UseRegister(node->InputAt(1)))
1126 ->MarkAsCall(); 1008 ->MarkAsCall();
1127 } 1009 }
1128 1010
1129 void InstructionSelector::VisitFloat64Ieee754Unop(Node* node, 1011 void InstructionSelector::VisitFloat64Ieee754Unop(Node* node,
1130 InstructionCode opcode) { 1012 InstructionCode opcode) {
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
1676 } 1558 }
1677 1559
1678 1560
1679 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { 1561 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) {
1680 FlagsContinuation cont = 1562 FlagsContinuation cont =
1681 FlagsContinuation::ForSet(kUnsignedGreaterThanOrEqual, node); 1563 FlagsContinuation::ForSet(kUnsignedGreaterThanOrEqual, node);
1682 VisitFloat64Compare(this, node, &cont); 1564 VisitFloat64Compare(this, node, &cont);
1683 } 1565 }
1684 1566
1685 1567
1686 void InstructionSelector::VisitFloat64ExtractLowWord32(Node* node) {
1687 IA32OperandGenerator g(this);
1688 Emit(kSSEFloat64ExtractLowWord32, g.DefineAsRegister(node),
1689 g.Use(node->InputAt(0)));
1690 }
1691
1692
1693 void InstructionSelector::VisitFloat64ExtractHighWord32(Node* node) {
1694 IA32OperandGenerator g(this);
1695 Emit(kSSEFloat64ExtractHighWord32, g.DefineAsRegister(node),
1696 g.Use(node->InputAt(0)));
1697 }
1698
1699 1568
1700 void InstructionSelector::VisitFloat64InsertLowWord32(Node* node) { 1569 void InstructionSelector::VisitFloat64InsertLowWord32(Node* node) {
1701 IA32OperandGenerator g(this); 1570 IA32OperandGenerator g(this);
1702 Node* left = node->InputAt(0); 1571 Node* left = node->InputAt(0);
1703 Node* right = node->InputAt(1); 1572 Node* right = node->InputAt(1);
1704 Float64Matcher mleft(left); 1573 Float64Matcher mleft(left);
1705 if (mleft.HasValue() && (bit_cast<uint64_t>(mleft.Value()) >> 32) == 0u) { 1574 if (mleft.HasValue() && (bit_cast<uint64_t>(mleft.Value()) >> 32) == 0u) {
1706 Emit(kSSEFloat64LoadLowWord32, g.DefineAsRegister(node), g.Use(right)); 1575 Emit(kSSEFloat64LoadLowWord32, g.DefineAsRegister(node), g.Use(right));
1707 return; 1576 return;
1708 } 1577 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1797 // static 1666 // static
1798 MachineOperatorBuilder::AlignmentRequirements 1667 MachineOperatorBuilder::AlignmentRequirements
1799 InstructionSelector::AlignmentRequirements() { 1668 InstructionSelector::AlignmentRequirements() {
1800 return MachineOperatorBuilder::AlignmentRequirements:: 1669 return MachineOperatorBuilder::AlignmentRequirements::
1801 FullUnalignedAccessSupport(); 1670 FullUnalignedAccessSupport();
1802 } 1671 }
1803 1672
1804 } // namespace compiler 1673 } // namespace compiler
1805 } // namespace internal 1674 } // namespace internal
1806 } // namespace v8 1675 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698