OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 case kImmutableArrayCid: | 961 case kImmutableArrayCid: |
962 case kTypedDataInt8ArrayCid: | 962 case kTypedDataInt8ArrayCid: |
963 case kTypedDataUint8ArrayCid: | 963 case kTypedDataUint8ArrayCid: |
964 case kTypedDataUint8ClampedArrayCid: | 964 case kTypedDataUint8ClampedArrayCid: |
965 case kExternalTypedDataUint8ArrayCid: | 965 case kExternalTypedDataUint8ArrayCid: |
966 case kExternalTypedDataUint8ClampedArrayCid: | 966 case kExternalTypedDataUint8ClampedArrayCid: |
967 case kTypedDataInt16ArrayCid: | 967 case kTypedDataInt16ArrayCid: |
968 case kTypedDataUint16ArrayCid: | 968 case kTypedDataUint16ArrayCid: |
969 case kOneByteStringCid: | 969 case kOneByteStringCid: |
970 case kTwoByteStringCid: | 970 case kTwoByteStringCid: |
| 971 return kTagged; |
971 case kTypedDataInt32ArrayCid: | 972 case kTypedDataInt32ArrayCid: |
| 973 return kUnboxedInt32; |
972 case kTypedDataUint32ArrayCid: | 974 case kTypedDataUint32ArrayCid: |
973 return kTagged; | 975 return kUnboxedUint32; |
974 case kTypedDataFloat32ArrayCid: | 976 case kTypedDataFloat32ArrayCid: |
975 case kTypedDataFloat64ArrayCid: | 977 case kTypedDataFloat64ArrayCid: |
976 return kUnboxedDouble; | 978 return kUnboxedDouble; |
977 case kTypedDataInt32x4ArrayCid: | 979 case kTypedDataInt32x4ArrayCid: |
978 return kUnboxedInt32x4; | 980 return kUnboxedInt32x4; |
979 case kTypedDataFloat32x4ArrayCid: | 981 case kTypedDataFloat32x4ArrayCid: |
980 return kUnboxedFloat32x4; | 982 return kUnboxedFloat32x4; |
981 case kTypedDataFloat64x2ArrayCid: | 983 case kTypedDataFloat64x2ArrayCid: |
982 return kUnboxedFloat64x2; | 984 return kUnboxedFloat64x2; |
983 default: | 985 default: |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1045 __ movsd(result, element_address); | 1047 __ movsd(result, element_address); |
1046 } else { | 1048 } else { |
1047 ASSERT((class_id() == kTypedDataInt32x4ArrayCid) || | 1049 ASSERT((class_id() == kTypedDataInt32x4ArrayCid) || |
1048 (class_id() == kTypedDataFloat32x4ArrayCid) || | 1050 (class_id() == kTypedDataFloat32x4ArrayCid) || |
1049 (class_id() == kTypedDataFloat64x2ArrayCid)); | 1051 (class_id() == kTypedDataFloat64x2ArrayCid)); |
1050 __ movups(result, element_address); | 1052 __ movups(result, element_address); |
1051 } | 1053 } |
1052 return; | 1054 return; |
1053 } | 1055 } |
1054 | 1056 |
| 1057 if ((representation() == kUnboxedUint32) || |
| 1058 (representation() == kUnboxedInt32)) { |
| 1059 if ((index_scale() == 1) && index.IsRegister()) { |
| 1060 __ SmiUntag(index.reg()); |
| 1061 } |
| 1062 Register result = locs()->out(0).reg(); |
| 1063 switch (class_id()) { |
| 1064 case kTypedDataInt32ArrayCid: |
| 1065 ASSERT(representation() == kUnboxedInt32); |
| 1066 __ movsxd(result, element_address); |
| 1067 break; |
| 1068 case kTypedDataUint32ArrayCid: |
| 1069 ASSERT(representation() == kUnboxedUint32); |
| 1070 __ movl(result, element_address); |
| 1071 break; |
| 1072 default: |
| 1073 UNREACHABLE(); |
| 1074 } |
| 1075 return; |
| 1076 } |
| 1077 |
| 1078 ASSERT(representation() == kTagged); |
| 1079 |
1055 if ((index_scale() == 1) && index.IsRegister()) { | 1080 if ((index_scale() == 1) && index.IsRegister()) { |
1056 __ SmiUntag(index.reg()); | 1081 __ SmiUntag(index.reg()); |
1057 } | 1082 } |
1058 Register result = locs()->out(0).reg(); | 1083 Register result = locs()->out(0).reg(); |
1059 switch (class_id()) { | 1084 switch (class_id()) { |
1060 case kTypedDataInt8ArrayCid: | 1085 case kTypedDataInt8ArrayCid: |
1061 __ movsxb(result, element_address); | 1086 __ movsxb(result, element_address); |
1062 __ SmiTag(result); | 1087 __ SmiTag(result); |
1063 break; | 1088 break; |
1064 case kTypedDataUint8ArrayCid: | 1089 case kTypedDataUint8ArrayCid: |
1065 case kTypedDataUint8ClampedArrayCid: | 1090 case kTypedDataUint8ClampedArrayCid: |
1066 case kExternalTypedDataUint8ArrayCid: | 1091 case kExternalTypedDataUint8ArrayCid: |
1067 case kExternalTypedDataUint8ClampedArrayCid: | 1092 case kExternalTypedDataUint8ClampedArrayCid: |
1068 case kOneByteStringCid: | 1093 case kOneByteStringCid: |
1069 __ movzxb(result, element_address); | 1094 __ movzxb(result, element_address); |
1070 __ SmiTag(result); | 1095 __ SmiTag(result); |
1071 break; | 1096 break; |
1072 case kTypedDataInt16ArrayCid: | 1097 case kTypedDataInt16ArrayCid: |
1073 __ movsxw(result, element_address); | 1098 __ movsxw(result, element_address); |
1074 __ SmiTag(result); | 1099 __ SmiTag(result); |
1075 break; | 1100 break; |
1076 case kTypedDataUint16ArrayCid: | 1101 case kTypedDataUint16ArrayCid: |
1077 case kTwoByteStringCid: | 1102 case kTwoByteStringCid: |
1078 __ movzxw(result, element_address); | 1103 __ movzxw(result, element_address); |
1079 __ SmiTag(result); | 1104 __ SmiTag(result); |
1080 break; | 1105 break; |
1081 case kTypedDataInt32ArrayCid: | |
1082 __ movsxd(result, element_address); | |
1083 __ SmiTag(result); | |
1084 break; | |
1085 case kTypedDataUint32ArrayCid: | |
1086 __ movl(result, element_address); | |
1087 __ SmiTag(result); | |
1088 break; | |
1089 default: | 1106 default: |
1090 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); | 1107 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); |
1091 __ movq(result, element_address); | 1108 __ movq(result, element_address); |
1092 break; | 1109 break; |
1093 } | 1110 } |
1094 } | 1111 } |
1095 | 1112 |
1096 | 1113 |
1097 Representation StoreIndexedInstr::RequiredInputRepresentation( | 1114 Representation StoreIndexedInstr::RequiredInputRepresentation( |
1098 intptr_t idx) const { | 1115 intptr_t idx) const { |
(...skipping 4828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5927 __ movq(R10, Immediate(kInvalidObjectPointer)); | 5944 __ movq(R10, Immediate(kInvalidObjectPointer)); |
5928 __ movq(RBX, Immediate(kInvalidObjectPointer)); | 5945 __ movq(RBX, Immediate(kInvalidObjectPointer)); |
5929 #endif | 5946 #endif |
5930 } | 5947 } |
5931 | 5948 |
5932 } // namespace dart | 5949 } // namespace dart |
5933 | 5950 |
5934 #undef __ | 5951 #undef __ |
5935 | 5952 |
5936 #endif // defined TARGET_ARCH_X64 | 5953 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |