| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |