OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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_XXX. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_XXX. |
6 | 6 |
7 #include "vm/flow_graph_compiler.h" | 7 #include "vm/flow_graph_compiler.h" |
8 | 8 |
9 #include "vm/cha.h" | 9 #include "vm/cha.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1034 | 1034 |
1035 intptr_t FlowGraphCompiler::ElementSizeFor(intptr_t cid) { | 1035 intptr_t FlowGraphCompiler::ElementSizeFor(intptr_t cid) { |
1036 switch (cid) { | 1036 switch (cid) { |
1037 case kArrayCid: | 1037 case kArrayCid: |
1038 case kImmutableArrayCid: | 1038 case kImmutableArrayCid: |
1039 return Array::kBytesPerElement; | 1039 return Array::kBytesPerElement; |
1040 case kFloat32ArrayCid: | 1040 case kFloat32ArrayCid: |
1041 return Float32Array::kBytesPerElement; | 1041 return Float32Array::kBytesPerElement; |
1042 case kFloat64ArrayCid: | 1042 case kFloat64ArrayCid: |
1043 return Float64Array::kBytesPerElement; | 1043 return Float64Array::kBytesPerElement; |
| 1044 case kInt8ArrayCid: |
| 1045 return Int8Array::kBytesPerElement; |
1044 case kUint8ArrayCid: | 1046 case kUint8ArrayCid: |
1045 return Uint8Array::kBytesPerElement; | 1047 return Uint8Array::kBytesPerElement; |
1046 case kUint8ClampedArrayCid: | 1048 case kUint8ClampedArrayCid: |
1047 return Uint8ClampedArray::kBytesPerElement; | 1049 return Uint8ClampedArray::kBytesPerElement; |
| 1050 case kInt16ArrayCid: |
| 1051 return Int16Array::kBytesPerElement; |
| 1052 case kUint16ArrayCid: |
| 1053 return Uint16Array::kBytesPerElement; |
1048 case kOneByteStringCid: | 1054 case kOneByteStringCid: |
1049 return OneByteString::kBytesPerElement; | 1055 return OneByteString::kBytesPerElement; |
1050 case kTwoByteStringCid: | 1056 case kTwoByteStringCid: |
1051 return TwoByteString::kBytesPerElement; | 1057 return TwoByteString::kBytesPerElement; |
| 1058 case kExternalUint8ArrayCid: |
| 1059 return ExternalUint8Array::kBytesPerElement; |
1052 default: | 1060 default: |
1053 UNIMPLEMENTED(); | 1061 UNIMPLEMENTED(); |
1054 return 0; | 1062 return 0; |
1055 } | 1063 } |
1056 } | 1064 } |
1057 | 1065 |
1058 | 1066 |
1059 intptr_t FlowGraphCompiler::DataOffsetFor(intptr_t cid) { | 1067 intptr_t FlowGraphCompiler::DataOffsetFor(intptr_t cid) { |
1060 switch (cid) { | 1068 switch (cid) { |
1061 case kArrayCid: | 1069 case kArrayCid: |
1062 case kImmutableArrayCid: | 1070 case kImmutableArrayCid: |
1063 return Array::data_offset(); | 1071 return Array::data_offset(); |
1064 case kFloat32ArrayCid: | 1072 case kFloat32ArrayCid: |
1065 return Float32Array::data_offset(); | 1073 return Float32Array::data_offset(); |
1066 case kFloat64ArrayCid: | 1074 case kFloat64ArrayCid: |
1067 return Float64Array::data_offset(); | 1075 return Float64Array::data_offset(); |
| 1076 case kInt8ArrayCid: |
| 1077 return Int8Array::data_offset(); |
1068 case kUint8ArrayCid: | 1078 case kUint8ArrayCid: |
1069 return Uint8Array::data_offset(); | 1079 return Uint8Array::data_offset(); |
1070 case kUint8ClampedArrayCid: | 1080 case kUint8ClampedArrayCid: |
1071 return Uint8ClampedArray::data_offset(); | 1081 return Uint8ClampedArray::data_offset(); |
| 1082 case kInt16ArrayCid: |
| 1083 return Int16Array::data_offset(); |
| 1084 case kUint16ArrayCid: |
| 1085 return Uint16Array::data_offset(); |
1072 case kOneByteStringCid: | 1086 case kOneByteStringCid: |
1073 return OneByteString::data_offset(); | 1087 return OneByteString::data_offset(); |
1074 case kTwoByteStringCid: | 1088 case kTwoByteStringCid: |
1075 return TwoByteString::data_offset(); | 1089 return TwoByteString::data_offset(); |
1076 default: | 1090 default: |
1077 UNIMPLEMENTED(); | 1091 UNIMPLEMENTED(); |
1078 return Array::data_offset(); | 1092 return Array::data_offset(); |
1079 } | 1093 } |
1080 } | 1094 } |
1081 | 1095 |
(...skipping 17 matching lines...) Expand all Loading... |
1099 ASSERT(kSmiTagShift == 1); | 1113 ASSERT(kSmiTagShift == 1); |
1100 switch (cid) { | 1114 switch (cid) { |
1101 case kArrayCid: | 1115 case kArrayCid: |
1102 case kImmutableArrayCid: | 1116 case kImmutableArrayCid: |
1103 return FieldAddress( | 1117 return FieldAddress( |
1104 array, index, TIMES_HALF_WORD_SIZE, Array::data_offset()); | 1118 array, index, TIMES_HALF_WORD_SIZE, Array::data_offset()); |
1105 case kFloat32ArrayCid: | 1119 case kFloat32ArrayCid: |
1106 return FieldAddress(array, index, TIMES_2, Float32Array::data_offset()); | 1120 return FieldAddress(array, index, TIMES_2, Float32Array::data_offset()); |
1107 case kFloat64ArrayCid: | 1121 case kFloat64ArrayCid: |
1108 return FieldAddress(array, index, TIMES_4, Float64Array::data_offset()); | 1122 return FieldAddress(array, index, TIMES_4, Float64Array::data_offset()); |
| 1123 case kInt8ArrayCid: |
| 1124 return FieldAddress(array, index, TIMES_1, Int8Array::data_offset()); |
1109 case kUint8ArrayCid: | 1125 case kUint8ArrayCid: |
1110 return FieldAddress(array, index, TIMES_1, Uint8Array::data_offset()); | 1126 return FieldAddress(array, index, TIMES_1, Uint8Array::data_offset()); |
1111 case kUint8ClampedArrayCid: | 1127 case kUint8ClampedArrayCid: |
1112 return | 1128 return |
1113 FieldAddress(array, index, TIMES_1, Uint8ClampedArray::data_offset()); | 1129 FieldAddress(array, index, TIMES_1, Uint8ClampedArray::data_offset()); |
| 1130 case kInt16ArrayCid: |
| 1131 return FieldAddress(array, index, TIMES_1, Int16Array::data_offset()); |
| 1132 case kUint16ArrayCid: |
| 1133 return FieldAddress(array, index, TIMES_1, Uint16Array::data_offset()); |
1114 case kOneByteStringCid: | 1134 case kOneByteStringCid: |
1115 return FieldAddress(array, index, TIMES_1, OneByteString::data_offset()); | 1135 return FieldAddress(array, index, TIMES_1, OneByteString::data_offset()); |
1116 case kTwoByteStringCid: | 1136 case kTwoByteStringCid: |
1117 return FieldAddress(array, index, TIMES_1, TwoByteString::data_offset()); | 1137 return FieldAddress(array, index, TIMES_1, TwoByteString::data_offset()); |
1118 default: | 1138 default: |
1119 UNIMPLEMENTED(); | 1139 UNIMPLEMENTED(); |
1120 return FieldAddress(SPREG, 0); | 1140 return FieldAddress(SPREG, 0); |
1121 } | 1141 } |
1122 } | 1142 } |
1123 | 1143 |
1124 | 1144 |
| 1145 Address FlowGraphCompiler::ExternalElementAddressForIntIndex(intptr_t cid, |
| 1146 Register array, |
| 1147 intptr_t index) { |
| 1148 return Address(array, index * ElementSizeFor(cid)); |
| 1149 } |
| 1150 |
| 1151 |
| 1152 Address FlowGraphCompiler::ExternalElementAddressForRegIndex(intptr_t cid, |
| 1153 Register array, |
| 1154 Register index) { |
| 1155 switch (cid) { |
| 1156 case kExternalUint8ArrayCid: |
| 1157 return Address(array, index, TIMES_1, 0); |
| 1158 default: |
| 1159 UNIMPLEMENTED(); |
| 1160 return Address(SPREG, 0); |
| 1161 } |
| 1162 } |
| 1163 |
| 1164 |
1125 // Returns true if checking against this type is a direct class id comparison. | 1165 // Returns true if checking against this type is a direct class id comparison. |
1126 bool FlowGraphCompiler::TypeCheckAsClassEquality(const AbstractType& type) { | 1166 bool FlowGraphCompiler::TypeCheckAsClassEquality(const AbstractType& type) { |
1127 ASSERT(type.IsFinalized() && !type.IsMalformed()); | 1167 ASSERT(type.IsFinalized() && !type.IsMalformed()); |
1128 // Requires CHA, which can be applied in optimized code only, | 1168 // Requires CHA, which can be applied in optimized code only, |
1129 if (!FLAG_use_cha || !is_optimizing()) return false; | 1169 if (!FLAG_use_cha || !is_optimizing()) return false; |
1130 if (!type.IsInstantiated()) return false; | 1170 if (!type.IsInstantiated()) return false; |
1131 const Class& type_class = Class::Handle(type.type_class()); | 1171 const Class& type_class = Class::Handle(type.type_class()); |
1132 // Signature classes have different type checking rules. | 1172 // Signature classes have different type checking rules. |
1133 if (type_class.IsSignatureClass()) return false; | 1173 if (type_class.IsSignatureClass()) return false; |
1134 // Could be an interface check? | 1174 // Could be an interface check? |
1135 if (type_class.is_implemented()) return false; | 1175 if (type_class.is_implemented()) return false; |
1136 const intptr_t type_cid = type_class.id(); | 1176 const intptr_t type_cid = type_class.id(); |
1137 if (CHA::HasSubclasses(type_cid)) return false; | 1177 if (CHA::HasSubclasses(type_cid)) return false; |
1138 if (type_class.HasTypeArguments()) { | 1178 if (type_class.HasTypeArguments()) { |
1139 // Only raw types can be directly compared, thus disregarding type | 1179 // Only raw types can be directly compared, thus disregarding type |
1140 // arguments. | 1180 // arguments. |
1141 const AbstractTypeArguments& type_arguments = | 1181 const AbstractTypeArguments& type_arguments = |
1142 AbstractTypeArguments::Handle(type.arguments()); | 1182 AbstractTypeArguments::Handle(type.arguments()); |
1143 const bool is_raw_type = type_arguments.IsNull() || | 1183 const bool is_raw_type = type_arguments.IsNull() || |
1144 type_arguments.IsRaw(type_arguments.Length()); | 1184 type_arguments.IsRaw(type_arguments.Length()); |
1145 return is_raw_type; | 1185 return is_raw_type; |
1146 } | 1186 } |
1147 return true; | 1187 return true; |
1148 } | 1188 } |
1149 | 1189 |
1150 } // namespace dart | 1190 } // namespace dart |
OLD | NEW |