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

Side by Side Diff: runtime/vm/intermediate_language_x64.cc

Issue 12775009: Optimize TypedData operators [] and []= in the same way as ScalarList. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: fixed x64 build and MethodRecognizer Created 7 years, 9 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698