| 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 "lib/error.h" | 10 #include "lib/error.h" |
| (...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 Symbols::kNullCharCodeSymbolOffset * kWordSize)); | 958 Symbols::kNullCharCodeSymbolOffset * kWordSize)); |
| 959 } | 959 } |
| 960 | 960 |
| 961 | 961 |
| 962 CompileType LoadIndexedInstr::ComputeType() const { | 962 CompileType LoadIndexedInstr::ComputeType() const { |
| 963 switch (class_id_) { | 963 switch (class_id_) { |
| 964 case kArrayCid: | 964 case kArrayCid: |
| 965 case kImmutableArrayCid: | 965 case kImmutableArrayCid: |
| 966 return CompileType::Dynamic(); | 966 return CompileType::Dynamic(); |
| 967 | 967 |
| 968 case kFloat32ArrayCid : | 968 case kFloat32ArrayCid: |
| 969 case kFloat64ArrayCid : | 969 case kFloat64ArrayCid: |
| 970 case kTypedDataFloat32ArrayCid: |
| 971 case kTypedDataFloat64ArrayCid: |
| 970 return CompileType::FromCid(kDoubleCid); | 972 return CompileType::FromCid(kDoubleCid); |
| 971 | 973 |
| 972 case kInt8ArrayCid: | 974 case kInt8ArrayCid: |
| 973 case kUint8ArrayCid: | 975 case kUint8ArrayCid: |
| 974 case kUint8ClampedArrayCid: | 976 case kUint8ClampedArrayCid: |
| 975 case kExternalUint8ArrayCid: | 977 case kExternalUint8ArrayCid: |
| 976 case kExternalUint8ClampedArrayCid: | 978 case kExternalUint8ClampedArrayCid: |
| 977 case kInt16ArrayCid: | 979 case kInt16ArrayCid: |
| 978 case kUint16ArrayCid: | 980 case kUint16ArrayCid: |
| 981 case kTypedDataInt8ArrayCid: |
| 982 case kTypedDataUint8ArrayCid: |
| 983 case kTypedDataUint8ClampedArrayCid: |
| 984 case kExternalTypedDataUint8ArrayCid: |
| 985 case kExternalTypedDataUint8ClampedArrayCid: |
| 986 case kTypedDataInt16ArrayCid: |
| 987 case kTypedDataUint16ArrayCid: |
| 979 case kOneByteStringCid: | 988 case kOneByteStringCid: |
| 980 case kTwoByteStringCid: | 989 case kTwoByteStringCid: |
| 981 case kInt32ArrayCid: | 990 case kInt32ArrayCid: |
| 982 case kUint32ArrayCid: | 991 case kUint32ArrayCid: |
| 992 case kTypedDataInt32ArrayCid: |
| 993 case kTypedDataUint32ArrayCid: |
| 983 return CompileType::FromCid(kSmiCid); | 994 return CompileType::FromCid(kSmiCid); |
| 984 | 995 |
| 985 default: | 996 default: |
| 986 UNIMPLEMENTED(); | 997 UNIMPLEMENTED(); |
| 987 return CompileType::Dynamic(); | 998 return CompileType::Dynamic(); |
| 988 } | 999 } |
| 989 } | 1000 } |
| 990 | 1001 |
| 991 | 1002 |
| 992 Representation LoadIndexedInstr::representation() const { | 1003 Representation LoadIndexedInstr::representation() const { |
| 993 switch (class_id_) { | 1004 switch (class_id_) { |
| 994 case kArrayCid: | 1005 case kArrayCid: |
| 995 case kImmutableArrayCid: | 1006 case kImmutableArrayCid: |
| 996 case kInt8ArrayCid: | 1007 case kInt8ArrayCid: |
| 997 case kUint8ArrayCid: | 1008 case kUint8ArrayCid: |
| 998 case kUint8ClampedArrayCid: | 1009 case kUint8ClampedArrayCid: |
| 999 case kExternalUint8ArrayCid: | 1010 case kExternalUint8ArrayCid: |
| 1000 case kExternalUint8ClampedArrayCid: | 1011 case kExternalUint8ClampedArrayCid: |
| 1001 case kInt16ArrayCid: | 1012 case kInt16ArrayCid: |
| 1002 case kUint16ArrayCid: | 1013 case kUint16ArrayCid: |
| 1014 case kTypedDataInt8ArrayCid: |
| 1015 case kTypedDataUint8ArrayCid: |
| 1016 case kTypedDataUint8ClampedArrayCid: |
| 1017 case kExternalTypedDataUint8ArrayCid: |
| 1018 case kExternalTypedDataUint8ClampedArrayCid: |
| 1019 case kTypedDataInt16ArrayCid: |
| 1020 case kTypedDataUint16ArrayCid: |
| 1003 case kOneByteStringCid: | 1021 case kOneByteStringCid: |
| 1004 case kTwoByteStringCid: | 1022 case kTwoByteStringCid: |
| 1005 case kInt32ArrayCid: | 1023 case kInt32ArrayCid: |
| 1006 case kUint32ArrayCid: | 1024 case kUint32ArrayCid: |
| 1025 case kTypedDataInt32ArrayCid: |
| 1026 case kTypedDataUint32ArrayCid: |
| 1007 return kTagged; | 1027 return kTagged; |
| 1008 case kFloat32ArrayCid : | 1028 case kFloat32ArrayCid : |
| 1009 case kFloat64ArrayCid : | 1029 case kFloat64ArrayCid : |
| 1030 case kTypedDataFloat32ArrayCid: |
| 1031 case kTypedDataFloat64ArrayCid: |
| 1010 return kUnboxedDouble; | 1032 return kUnboxedDouble; |
| 1011 default: | 1033 default: |
| 1012 UNIMPLEMENTED(); | 1034 UNIMPLEMENTED(); |
| 1013 return kTagged; | 1035 return kTagged; |
| 1014 } | 1036 } |
| 1015 } | 1037 } |
| 1016 | 1038 |
| 1017 | 1039 |
| 1018 LocationSummary* LoadIndexedInstr::MakeLocationSummary() const { | 1040 LocationSummary* LoadIndexedInstr::MakeLocationSummary() const { |
| 1019 const intptr_t kNumInputs = 2; | 1041 const intptr_t kNumInputs = 2; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1041 } | 1063 } |
| 1042 return locs; | 1064 return locs; |
| 1043 } | 1065 } |
| 1044 | 1066 |
| 1045 | 1067 |
| 1046 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1068 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 1047 Register array = locs()->in(0).reg(); | 1069 Register array = locs()->in(0).reg(); |
| 1048 Location index = locs()->in(1); | 1070 Location index = locs()->in(1); |
| 1049 | 1071 |
| 1050 if ((class_id() == kExternalUint8ArrayCid) || | 1072 if ((class_id() == kExternalUint8ArrayCid) || |
| 1051 (class_id() == kExternalUint8ClampedArrayCid)) { | 1073 (class_id() == kExternalUint8ClampedArrayCid) || |
| 1074 (class_id() == kExternalTypedDataUint8ArrayCid) || |
| 1075 (class_id() == kExternalTypedDataUint8ClampedArrayCid)) { |
| 1052 Register result = locs()->out().reg(); | 1076 Register result = locs()->out().reg(); |
| 1053 Address element_address = index.IsRegister() | 1077 Address element_address = index.IsRegister() |
| 1054 ? FlowGraphCompiler::ExternalElementAddressForRegIndex( | 1078 ? FlowGraphCompiler::ExternalElementAddressForRegIndex( |
| 1055 class_id(), index_scale(), result, index.reg()) | 1079 index_scale(), result, index.reg()) |
| 1056 : FlowGraphCompiler::ExternalElementAddressForIntIndex( | 1080 : FlowGraphCompiler::ExternalElementAddressForIntIndex( |
| 1057 class_id(), index_scale(), result, | 1081 index_scale(), result, Smi::Cast(index.constant()).Value()); |
| 1058 Smi::Cast(index.constant()).Value()); | |
| 1059 ASSERT(index_scale() == 1); | 1082 ASSERT(index_scale() == 1); |
| 1060 if (index.IsRegister()) { | 1083 if (index.IsRegister()) { |
| 1061 __ SmiUntag(index.reg()); | 1084 __ SmiUntag(index.reg()); |
| 1062 } | 1085 } |
| 1063 __ movq(result, | 1086 __ movq(result, |
| 1064 FieldAddress(array, ExternalUint8Array::data_offset())); | 1087 FieldAddress(array, ExternalUint8Array::data_offset())); |
| 1065 __ movzxb(result, element_address); | 1088 __ movzxb(result, element_address); |
| 1066 __ SmiTag(result); | 1089 __ SmiTag(result); |
| 1067 return; | 1090 return; |
| 1068 } | 1091 } |
| 1069 | 1092 |
| 1070 FieldAddress element_address = index.IsRegister() | 1093 FieldAddress element_address = index.IsRegister() |
| 1071 ? FlowGraphCompiler::ElementAddressForRegIndex( | 1094 ? FlowGraphCompiler::ElementAddressForRegIndex( |
| 1072 class_id(), index_scale(), array, index.reg()) | 1095 class_id(), index_scale(), array, index.reg()) |
| 1073 : FlowGraphCompiler::ElementAddressForIntIndex( | 1096 : FlowGraphCompiler::ElementAddressForIntIndex( |
| 1074 class_id(), index_scale(), array, | 1097 class_id(), index_scale(), array, |
| 1075 Smi::Cast(index.constant()).Value()); | 1098 Smi::Cast(index.constant()).Value()); |
| 1076 | 1099 |
| 1077 if (representation() == kUnboxedDouble) { | 1100 if (representation() == kUnboxedDouble) { |
| 1078 if ((index_scale() == 1) && index.IsRegister()) { | 1101 if ((index_scale() == 1) && index.IsRegister()) { |
| 1079 __ SmiUntag(index.reg()); | 1102 __ SmiUntag(index.reg()); |
| 1080 } | 1103 } |
| 1081 | 1104 |
| 1082 XmmRegister result = locs()->out().fpu_reg(); | 1105 XmmRegister result = locs()->out().fpu_reg(); |
| 1083 if (class_id() == kFloat32ArrayCid) { | 1106 if (class_id() == kFloat32ArrayCid || |
| 1107 class_id() == kTypedDataFloat32ArrayCid) { |
| 1084 // Load single precision float. | 1108 // Load single precision float. |
| 1085 __ movss(result, element_address); | 1109 __ movss(result, element_address); |
| 1086 // Promote to double. | 1110 // Promote to double. |
| 1087 __ cvtss2sd(result, locs()->out().fpu_reg()); | 1111 __ cvtss2sd(result, locs()->out().fpu_reg()); |
| 1088 } else { | 1112 } else { |
| 1089 ASSERT(class_id() == kFloat64ArrayCid); | 1113 ASSERT(class_id() == kFloat64ArrayCid || |
| 1114 class_id() == kTypedDataFloat64ArrayCid); |
| 1090 __ movsd(result, element_address); | 1115 __ movsd(result, element_address); |
| 1091 } | 1116 } |
| 1092 return; | 1117 return; |
| 1093 } | 1118 } |
| 1094 | 1119 |
| 1095 if ((index_scale() == 1) && index.IsRegister()) { | 1120 if ((index_scale() == 1) && index.IsRegister()) { |
| 1096 __ SmiUntag(index.reg()); | 1121 __ SmiUntag(index.reg()); |
| 1097 } | 1122 } |
| 1098 Register result = locs()->out().reg(); | 1123 Register result = locs()->out().reg(); |
| 1099 switch (class_id()) { | 1124 switch (class_id()) { |
| 1100 case kInt8ArrayCid: | 1125 case kInt8ArrayCid: |
| 1126 case kTypedDataInt8ArrayCid: |
| 1127 __ movsxb(result, element_address); |
| 1128 __ SmiTag(result); |
| 1129 break; |
| 1101 case kUint8ArrayCid: | 1130 case kUint8ArrayCid: |
| 1102 case kUint8ClampedArrayCid: | 1131 case kUint8ClampedArrayCid: |
| 1132 case kTypedDataUint8ArrayCid: |
| 1133 case kTypedDataUint8ClampedArrayCid: |
| 1103 case kOneByteStringCid: | 1134 case kOneByteStringCid: |
| 1104 if (class_id() == kInt8ArrayCid) { | 1135 __ movzxb(result, element_address); |
| 1105 __ movsxb(result, element_address); | |
| 1106 } else { | |
| 1107 __ movzxb(result, element_address); | |
| 1108 } | |
| 1109 __ SmiTag(result); | 1136 __ SmiTag(result); |
| 1110 break; | 1137 break; |
| 1111 case kInt16ArrayCid: | 1138 case kInt16ArrayCid: |
| 1139 case kTypedDataInt16ArrayCid: |
| 1112 __ movsxw(result, element_address); | 1140 __ movsxw(result, element_address); |
| 1113 __ SmiTag(result); | 1141 __ SmiTag(result); |
| 1114 break; | 1142 break; |
| 1115 case kUint16ArrayCid: | 1143 case kUint16ArrayCid: |
| 1144 case kTypedDataUint16ArrayCid: |
| 1116 case kTwoByteStringCid: | 1145 case kTwoByteStringCid: |
| 1117 __ movzxw(result, element_address); | 1146 __ movzxw(result, element_address); |
| 1118 __ SmiTag(result); | 1147 __ SmiTag(result); |
| 1119 break; | 1148 break; |
| 1120 case kInt32ArrayCid: | 1149 case kInt32ArrayCid: |
| 1150 case kTypedDataInt32ArrayCid: |
| 1121 __ movsxl(result, element_address); | 1151 __ movsxl(result, element_address); |
| 1122 __ SmiTag(result); | 1152 __ SmiTag(result); |
| 1123 break; | 1153 break; |
| 1124 case kUint32ArrayCid: | 1154 case kUint32ArrayCid: |
| 1155 case kTypedDataUint32ArrayCid: |
| 1125 __ movl(result, element_address); | 1156 __ movl(result, element_address); |
| 1126 __ SmiTag(result); | 1157 __ SmiTag(result); |
| 1127 break; | 1158 break; |
| 1128 default: | 1159 default: |
| 1129 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); | 1160 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); |
| 1130 __ movq(result, element_address); | 1161 __ movq(result, element_address); |
| 1131 break; | 1162 break; |
| 1132 } | 1163 } |
| 1133 } | 1164 } |
| 1134 | 1165 |
| 1135 | 1166 |
| 1136 Representation StoreIndexedInstr::RequiredInputRepresentation( | 1167 Representation StoreIndexedInstr::RequiredInputRepresentation( |
| 1137 intptr_t idx) const { | 1168 intptr_t idx) const { |
| 1138 if ((idx == 0) || (idx == 1)) return kTagged; | 1169 if ((idx == 0) || (idx == 1)) return kTagged; |
| 1139 ASSERT(idx == 2); | 1170 ASSERT(idx == 2); |
| 1140 switch (class_id_) { | 1171 switch (class_id_) { |
| 1141 case kArrayCid: | 1172 case kArrayCid: |
| 1142 case kInt8ArrayCid: | 1173 case kInt8ArrayCid: |
| 1143 case kUint8ArrayCid: | 1174 case kUint8ArrayCid: |
| 1144 case kExternalUint8ArrayCid: | 1175 case kExternalUint8ArrayCid: |
| 1145 case kUint8ClampedArrayCid: | 1176 case kUint8ClampedArrayCid: |
| 1146 case kExternalUint8ClampedArrayCid: | 1177 case kExternalUint8ClampedArrayCid: |
| 1147 case kInt16ArrayCid: | 1178 case kInt16ArrayCid: |
| 1148 case kUint16ArrayCid: | 1179 case kUint16ArrayCid: |
| 1149 case kInt32ArrayCid: | 1180 case kInt32ArrayCid: |
| 1150 case kUint32ArrayCid: | 1181 case kUint32ArrayCid: |
| 1182 case kTypedDataInt8ArrayCid: |
| 1183 case kTypedDataUint8ArrayCid: |
| 1184 case kExternalTypedDataUint8ArrayCid: |
| 1185 case kTypedDataUint8ClampedArrayCid: |
| 1186 case kExternalTypedDataUint8ClampedArrayCid: |
| 1187 case kTypedDataInt16ArrayCid: |
| 1188 case kTypedDataUint16ArrayCid: |
| 1189 case kTypedDataInt32ArrayCid: |
| 1190 case kTypedDataUint32ArrayCid: |
| 1151 return kTagged; | 1191 return kTagged; |
| 1152 case kFloat32ArrayCid : | 1192 case kFloat32ArrayCid: |
| 1153 case kFloat64ArrayCid : | 1193 case kFloat64ArrayCid: |
| 1194 case kTypedDataFloat32ArrayCid: |
| 1195 case kTypedDataFloat64ArrayCid: |
| 1154 return kUnboxedDouble; | 1196 return kUnboxedDouble; |
| 1155 default: | 1197 default: |
| 1156 UNIMPLEMENTED(); | 1198 UNIMPLEMENTED(); |
| 1157 return kTagged; | 1199 return kTagged; |
| 1158 } | 1200 } |
| 1159 } | 1201 } |
| 1160 | 1202 |
| 1161 | 1203 |
| 1162 LocationSummary* StoreIndexedInstr::MakeLocationSummary() const { | 1204 LocationSummary* StoreIndexedInstr::MakeLocationSummary() const { |
| 1163 const intptr_t kNumInputs = 3; | 1205 const intptr_t kNumInputs = 3; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1179 : Location::RequiresRegister()); | 1221 : Location::RequiresRegister()); |
| 1180 } | 1222 } |
| 1181 switch (class_id()) { | 1223 switch (class_id()) { |
| 1182 case kArrayCid: | 1224 case kArrayCid: |
| 1183 locs->set_in(2, ShouldEmitStoreBarrier() | 1225 locs->set_in(2, ShouldEmitStoreBarrier() |
| 1184 ? Location::WritableRegister() | 1226 ? Location::WritableRegister() |
| 1185 : Location::RegisterOrConstant(value())); | 1227 : Location::RegisterOrConstant(value())); |
| 1186 break; | 1228 break; |
| 1187 case kExternalUint8ArrayCid: | 1229 case kExternalUint8ArrayCid: |
| 1188 case kExternalUint8ClampedArrayCid: | 1230 case kExternalUint8ClampedArrayCid: |
| 1231 case kExternalTypedDataUint8ArrayCid: |
| 1232 case kExternalTypedDataUint8ClampedArrayCid: |
| 1189 // Need temp register to load the external array's data array. | 1233 // Need temp register to load the external array's data array. |
| 1190 locs->AddTemp(Location::RequiresRegister()); | 1234 locs->AddTemp(Location::RequiresRegister()); |
| 1191 // Fall through. | 1235 // Fall through. |
| 1192 case kInt8ArrayCid: | 1236 case kInt8ArrayCid: |
| 1193 case kUint8ArrayCid: | 1237 case kUint8ArrayCid: |
| 1194 case kUint8ClampedArrayCid: | 1238 case kUint8ClampedArrayCid: |
| 1239 case kTypedDataInt8ArrayCid: |
| 1240 case kTypedDataUint8ArrayCid: |
| 1241 case kTypedDataUint8ClampedArrayCid: |
| 1195 // TODO(fschneider): Add location constraint for byte registers (RAX, | 1242 // TODO(fschneider): Add location constraint for byte registers (RAX, |
| 1196 // RBX, RCX, RDX) instead of using a fixed register. | 1243 // RBX, RCX, RDX) instead of using a fixed register. |
| 1197 locs->set_in(2, Location::FixedRegisterOrSmiConstant(value(), RAX)); | 1244 locs->set_in(2, Location::FixedRegisterOrSmiConstant(value(), RAX)); |
| 1198 break; | 1245 break; |
| 1199 case kInt16ArrayCid: | 1246 case kInt16ArrayCid: |
| 1200 case kUint16ArrayCid: | 1247 case kUint16ArrayCid: |
| 1201 case kInt32ArrayCid: | 1248 case kInt32ArrayCid: |
| 1202 case kUint32ArrayCid: | 1249 case kUint32ArrayCid: |
| 1250 case kTypedDataInt16ArrayCid: |
| 1251 case kTypedDataUint16ArrayCid: |
| 1252 case kTypedDataInt32ArrayCid: |
| 1253 case kTypedDataUint32ArrayCid: |
| 1203 // Writable register because the value must be untagged before storing. | 1254 // Writable register because the value must be untagged before storing. |
| 1204 locs->set_in(2, Location::WritableRegister()); | 1255 locs->set_in(2, Location::WritableRegister()); |
| 1205 break; | 1256 break; |
| 1206 case kFloat32ArrayCid: | 1257 case kFloat32ArrayCid: |
| 1258 case kTypedDataFloat32ArrayCid: |
| 1207 // Need temp register for float-to-double conversion. | 1259 // Need temp register for float-to-double conversion. |
| 1208 locs->AddTemp(Location::RequiresFpuRegister()); | 1260 locs->AddTemp(Location::RequiresFpuRegister()); |
| 1209 // Fall through. | 1261 // Fall through. |
| 1210 case kFloat64ArrayCid: | 1262 case kFloat64ArrayCid: |
| 1263 case kTypedDataFloat64ArrayCid: |
| 1211 // TODO(srdjan): Support Float64 constants. | 1264 // TODO(srdjan): Support Float64 constants. |
| 1212 locs->set_in(2, Location::RequiresFpuRegister()); | 1265 locs->set_in(2, Location::RequiresFpuRegister()); |
| 1213 break; | 1266 break; |
| 1214 default: | 1267 default: |
| 1215 UNREACHABLE(); | 1268 UNREACHABLE(); |
| 1216 return NULL; | 1269 return NULL; |
| 1217 } | 1270 } |
| 1218 return locs; | 1271 return locs; |
| 1219 } | 1272 } |
| 1220 | 1273 |
| 1221 | 1274 |
| 1222 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1275 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 1223 Register array = locs()->in(0).reg(); | 1276 Register array = locs()->in(0).reg(); |
| 1224 Location index = locs()->in(1); | 1277 Location index = locs()->in(1); |
| 1225 | 1278 |
| 1226 Address element_address(kNoRegister, 0); | 1279 Address element_address(kNoRegister, 0); |
| 1227 if ((class_id() == kExternalUint8ArrayCid) || | 1280 if ((class_id() == kExternalUint8ArrayCid) || |
| 1228 (class_id() == kExternalUint8ClampedArrayCid)) { | 1281 (class_id() == kExternalUint8ClampedArrayCid) || |
| 1282 (class_id() == kExternalTypedDataUint8ArrayCid) || |
| 1283 (class_id() == kExternalTypedDataUint8ClampedArrayCid)) { |
| 1229 Register temp = locs()->temp(0).reg(); | 1284 Register temp = locs()->temp(0).reg(); |
| 1230 element_address = index.IsRegister() | 1285 element_address = index.IsRegister() |
| 1231 ? FlowGraphCompiler::ExternalElementAddressForRegIndex( | 1286 ? FlowGraphCompiler::ExternalElementAddressForRegIndex( |
| 1232 class_id(), index_scale(), temp, index.reg()) | 1287 index_scale(), temp, index.reg()) |
| 1233 : FlowGraphCompiler::ExternalElementAddressForIntIndex( | 1288 : FlowGraphCompiler::ExternalElementAddressForIntIndex( |
| 1234 class_id(), index_scale(), temp, | 1289 index_scale(), temp, Smi::Cast(index.constant()).Value()); |
| 1235 Smi::Cast(index.constant()).Value()); | |
| 1236 __ movq(temp, | 1290 __ movq(temp, |
| 1237 FieldAddress(array, ExternalUint8Array::data_offset())); | 1291 FieldAddress(array, ExternalUint8Array::data_offset())); |
| 1238 } else { | 1292 } else { |
| 1239 element_address = index.IsRegister() | 1293 element_address = index.IsRegister() |
| 1240 ? FlowGraphCompiler::ElementAddressForRegIndex( | 1294 ? FlowGraphCompiler::ElementAddressForRegIndex( |
| 1241 class_id(), index_scale(), array, index.reg()) | 1295 class_id(), index_scale(), array, index.reg()) |
| 1242 : FlowGraphCompiler::ElementAddressForIntIndex( | 1296 : FlowGraphCompiler::ElementAddressForIntIndex( |
| 1243 class_id(), index_scale(), array, | 1297 class_id(), index_scale(), array, |
| 1244 Smi::Cast(index.constant()).Value()); | 1298 Smi::Cast(index.constant()).Value()); |
| 1245 } | 1299 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1256 const Object& constant = locs()->in(2).constant(); | 1310 const Object& constant = locs()->in(2).constant(); |
| 1257 __ StoreObject(element_address, constant); | 1311 __ StoreObject(element_address, constant); |
| 1258 } else { | 1312 } else { |
| 1259 Register value = locs()->in(2).reg(); | 1313 Register value = locs()->in(2).reg(); |
| 1260 __ StoreIntoObjectNoBarrier(array, element_address, value); | 1314 __ StoreIntoObjectNoBarrier(array, element_address, value); |
| 1261 } | 1315 } |
| 1262 break; | 1316 break; |
| 1263 case kInt8ArrayCid: | 1317 case kInt8ArrayCid: |
| 1264 case kUint8ArrayCid: | 1318 case kUint8ArrayCid: |
| 1265 case kExternalUint8ArrayCid: | 1319 case kExternalUint8ArrayCid: |
| 1320 case kTypedDataInt8ArrayCid: |
| 1321 case kTypedDataUint8ArrayCid: |
| 1322 case kExternalTypedDataUint8ArrayCid: |
| 1266 if (locs()->in(2).IsConstant()) { | 1323 if (locs()->in(2).IsConstant()) { |
| 1267 const Smi& constant = Smi::Cast(locs()->in(2).constant()); | 1324 const Smi& constant = Smi::Cast(locs()->in(2).constant()); |
| 1268 __ movb(element_address, | 1325 __ movb(element_address, |
| 1269 Immediate(static_cast<int8_t>(constant.Value()))); | 1326 Immediate(static_cast<int8_t>(constant.Value()))); |
| 1270 } else { | 1327 } else { |
| 1271 ASSERT(locs()->in(2).reg() == RAX); | 1328 ASSERT(locs()->in(2).reg() == RAX); |
| 1272 __ SmiUntag(RAX); | 1329 __ SmiUntag(RAX); |
| 1273 __ movb(element_address, RAX); | 1330 __ movb(element_address, RAX); |
| 1274 } | 1331 } |
| 1275 break; | 1332 break; |
| 1276 case kUint8ClampedArrayCid: | 1333 case kUint8ClampedArrayCid: |
| 1277 case kExternalUint8ClampedArrayCid: { | 1334 case kExternalUint8ClampedArrayCid: |
| 1335 case kTypedDataUint8ClampedArrayCid: |
| 1336 case kExternalTypedDataUint8ClampedArrayCid: { |
| 1278 if (locs()->in(2).IsConstant()) { | 1337 if (locs()->in(2).IsConstant()) { |
| 1279 const Smi& constant = Smi::Cast(locs()->in(2).constant()); | 1338 const Smi& constant = Smi::Cast(locs()->in(2).constant()); |
| 1280 intptr_t value = constant.Value(); | 1339 intptr_t value = constant.Value(); |
| 1281 // Clamp to 0x0 or 0xFF respectively. | 1340 // Clamp to 0x0 or 0xFF respectively. |
| 1282 if (value > 0xFF) { | 1341 if (value > 0xFF) { |
| 1283 value = 0xFF; | 1342 value = 0xFF; |
| 1284 } else if (value < 0) { | 1343 } else if (value < 0) { |
| 1285 value = 0; | 1344 value = 0; |
| 1286 } | 1345 } |
| 1287 __ movb(element_address, | 1346 __ movb(element_address, |
| 1288 Immediate(static_cast<int8_t>(value))); | 1347 Immediate(static_cast<int8_t>(value))); |
| 1289 } else { | 1348 } else { |
| 1290 ASSERT(locs()->in(2).reg() == RAX); | 1349 ASSERT(locs()->in(2).reg() == RAX); |
| 1291 Label store_value, store_0xff; | 1350 Label store_value, store_0xff; |
| 1292 __ SmiUntag(RAX); | 1351 __ SmiUntag(RAX); |
| 1293 __ cmpq(RAX, Immediate(0xFF)); | 1352 __ cmpq(RAX, Immediate(0xFF)); |
| 1294 __ j(BELOW_EQUAL, &store_value, Assembler::kNearJump); | 1353 __ j(BELOW_EQUAL, &store_value, Assembler::kNearJump); |
| 1295 // Clamp to 0x0 or 0xFF respectively. | 1354 // Clamp to 0x0 or 0xFF respectively. |
| 1296 __ j(GREATER, &store_0xff); | 1355 __ j(GREATER, &store_0xff); |
| 1297 __ xorq(RAX, RAX); | 1356 __ xorq(RAX, RAX); |
| 1298 __ jmp(&store_value, Assembler::kNearJump); | 1357 __ jmp(&store_value, Assembler::kNearJump); |
| 1299 __ Bind(&store_0xff); | 1358 __ Bind(&store_0xff); |
| 1300 __ movq(RAX, Immediate(0xFF)); | 1359 __ movq(RAX, Immediate(0xFF)); |
| 1301 __ Bind(&store_value); | 1360 __ Bind(&store_value); |
| 1302 __ movb(element_address, RAX); | 1361 __ movb(element_address, RAX); |
| 1303 } | 1362 } |
| 1304 break; | 1363 break; |
| 1305 } | 1364 } |
| 1306 case kInt16ArrayCid: | 1365 case kInt16ArrayCid: |
| 1307 case kUint16ArrayCid: { | 1366 case kUint16ArrayCid: |
| 1367 case kTypedDataInt16ArrayCid: |
| 1368 case kTypedDataUint16ArrayCid: { |
| 1308 Register value = locs()->in(2).reg(); | 1369 Register value = locs()->in(2).reg(); |
| 1309 __ SmiUntag(value); | 1370 __ SmiUntag(value); |
| 1310 __ movw(element_address, value); | 1371 __ movw(element_address, value); |
| 1311 break; | 1372 break; |
| 1312 } | 1373 } |
| 1313 case kInt32ArrayCid: | 1374 case kInt32ArrayCid: |
| 1314 case kUint32ArrayCid: { | 1375 case kUint32ArrayCid: |
| 1376 case kTypedDataInt32ArrayCid: |
| 1377 case kTypedDataUint32ArrayCid: { |
| 1315 Register value = locs()->in(2).reg(); | 1378 Register value = locs()->in(2).reg(); |
| 1316 __ SmiUntag(value); | 1379 __ SmiUntag(value); |
| 1317 __ movl(element_address, value); | 1380 __ movl(element_address, value); |
| 1318 break; | 1381 break; |
| 1319 } | 1382 } |
| 1320 case kFloat32ArrayCid: | 1383 case kFloat32ArrayCid: |
| 1384 case kTypedDataFloat32ArrayCid: |
| 1321 // Convert to single precision. | 1385 // Convert to single precision. |
| 1322 __ cvtsd2ss(locs()->temp(0).fpu_reg(), locs()->in(2).fpu_reg()); | 1386 __ cvtsd2ss(locs()->temp(0).fpu_reg(), locs()->in(2).fpu_reg()); |
| 1323 // Store. | 1387 // Store. |
| 1324 __ movss(element_address, locs()->temp(0).fpu_reg()); | 1388 __ movss(element_address, locs()->temp(0).fpu_reg()); |
| 1325 break; | 1389 break; |
| 1326 case kFloat64ArrayCid: | 1390 case kFloat64ArrayCid: |
| 1391 case kTypedDataFloat64ArrayCid: |
| 1327 __ movsd(element_address, locs()->in(2).fpu_reg()); | 1392 __ movsd(element_address, locs()->in(2).fpu_reg()); |
| 1328 break; | 1393 break; |
| 1329 default: | 1394 default: |
| 1330 UNREACHABLE(); | 1395 UNREACHABLE(); |
| 1331 } | 1396 } |
| 1332 } | 1397 } |
| 1333 | 1398 |
| 1334 | 1399 |
| 1335 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary() const { | 1400 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary() const { |
| 1336 const intptr_t kNumInputs = 2; | 1401 const intptr_t kNumInputs = 2; |
| (...skipping 1821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3158 PcDescriptors::kOther, | 3223 PcDescriptors::kOther, |
| 3159 locs()); | 3224 locs()); |
| 3160 __ Drop(2); // Discard type arguments and receiver. | 3225 __ Drop(2); // Discard type arguments and receiver. |
| 3161 } | 3226 } |
| 3162 | 3227 |
| 3163 } // namespace dart | 3228 } // namespace dart |
| 3164 | 3229 |
| 3165 #undef __ | 3230 #undef __ |
| 3166 | 3231 |
| 3167 #endif // defined TARGET_ARCH_X64 | 3232 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |