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

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

Issue 612553002: Make LoadIndexedInstr for Uint32List use kUnboxedUint32 representation (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 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
« no previous file with comments | « runtime/vm/flow_graph_optimizer.cc ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_ARM. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM.
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 1098 matching lines...) Expand 10 before | Expand all | Expand 10 after
1109 case kTypedDataUint8ClampedArrayCid: 1109 case kTypedDataUint8ClampedArrayCid:
1110 case kExternalTypedDataUint8ArrayCid: 1110 case kExternalTypedDataUint8ArrayCid:
1111 case kExternalTypedDataUint8ClampedArrayCid: 1111 case kExternalTypedDataUint8ClampedArrayCid:
1112 case kTypedDataInt16ArrayCid: 1112 case kTypedDataInt16ArrayCid:
1113 case kTypedDataUint16ArrayCid: 1113 case kTypedDataUint16ArrayCid:
1114 case kOneByteStringCid: 1114 case kOneByteStringCid:
1115 case kTwoByteStringCid: 1115 case kTwoByteStringCid:
1116 return CompileType::FromCid(kSmiCid); 1116 return CompileType::FromCid(kSmiCid);
1117 1117
1118 case kTypedDataInt32ArrayCid: 1118 case kTypedDataInt32ArrayCid:
1119 return Typed32BitIsSmi() ? CompileType::FromCid(kSmiCid)
Vyacheslav Egorov (Google) 2014/09/30 15:06:01 Any reason you don't want to support Int32List too
Cutch 2014/09/30 15:39:12 Done.
1120 : CompileType::FromCid(kMintCid);
1121
1119 case kTypedDataUint32ArrayCid: 1122 case kTypedDataUint32ArrayCid:
1120 return Typed32BitIsSmi() ? CompileType::FromCid(kSmiCid) 1123 return CompileType::FromCid(kMintCid);
Vyacheslav Egorov (Google) 2014/09/30 15:06:02 This is not correct actually: boxing can result in
Cutch 2014/09/30 15:39:12 Done. Here and above.
1121 : CompileType::FromCid(kMintCid);
1122 1124
1123 default: 1125 default:
1124 UNREACHABLE(); 1126 UNREACHABLE();
1125 return CompileType::Dynamic(); 1127 return CompileType::Dynamic();
1126 } 1128 }
1127 } 1129 }
1128 1130
1129 1131
1130 Representation LoadIndexedInstr::representation() const { 1132 Representation LoadIndexedInstr::representation() const {
1131 switch (class_id_) { 1133 switch (class_id_) {
1132 case kArrayCid: 1134 case kArrayCid:
1133 case kImmutableArrayCid: 1135 case kImmutableArrayCid:
1134 case kTypedDataInt8ArrayCid: 1136 case kTypedDataInt8ArrayCid:
1135 case kTypedDataUint8ArrayCid: 1137 case kTypedDataUint8ArrayCid:
1136 case kTypedDataUint8ClampedArrayCid: 1138 case kTypedDataUint8ClampedArrayCid:
1137 case kExternalTypedDataUint8ArrayCid: 1139 case kExternalTypedDataUint8ArrayCid:
1138 case kExternalTypedDataUint8ClampedArrayCid: 1140 case kExternalTypedDataUint8ClampedArrayCid:
1139 case kTypedDataInt16ArrayCid: 1141 case kTypedDataInt16ArrayCid:
1140 case kTypedDataUint16ArrayCid: 1142 case kTypedDataUint16ArrayCid:
1141 case kOneByteStringCid: 1143 case kOneByteStringCid:
1142 case kTwoByteStringCid: 1144 case kTwoByteStringCid:
1143 return kTagged; 1145 return kTagged;
1144 case kTypedDataInt32ArrayCid: 1146 case kTypedDataInt32ArrayCid:
1147 return Typed32BitIsSmi() ? kTagged : kUnboxedMint;
1145 case kTypedDataUint32ArrayCid: 1148 case kTypedDataUint32ArrayCid:
1146 return Typed32BitIsSmi() ? kTagged : kUnboxedMint; 1149 return kUnboxedUint32;
1147 case kTypedDataFloat32ArrayCid: 1150 case kTypedDataFloat32ArrayCid:
1148 case kTypedDataFloat64ArrayCid: 1151 case kTypedDataFloat64ArrayCid:
1149 return kUnboxedDouble; 1152 return kUnboxedDouble;
1150 case kTypedDataInt32x4ArrayCid: 1153 case kTypedDataInt32x4ArrayCid:
1151 return kUnboxedInt32x4; 1154 return kUnboxedInt32x4;
1152 case kTypedDataFloat32x4ArrayCid: 1155 case kTypedDataFloat32x4ArrayCid:
1153 return kUnboxedFloat32x4; 1156 return kUnboxedFloat32x4;
1154 case kTypedDataFloat64x2ArrayCid: 1157 case kTypedDataFloat64x2ArrayCid:
1155 return kUnboxedFloat64x2; 1158 return kUnboxedFloat64x2;
1156 default: 1159 default:
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1222 // Need register <= Q7 for float operations. 1225 // Need register <= Q7 for float operations.
1223 // TODO(fschneider): Add a register policy to specify a subset of 1226 // TODO(fschneider): Add a register policy to specify a subset of
1224 // registers. 1227 // registers.
1225 locs->set_out(0, Location::FpuRegisterLocation(Q7)); 1228 locs->set_out(0, Location::FpuRegisterLocation(Q7));
1226 } else { 1229 } else {
1227 locs->set_out(0, Location::RequiresFpuRegister()); 1230 locs->set_out(0, Location::RequiresFpuRegister());
1228 } 1231 }
1229 } else if (representation() == kUnboxedMint) { 1232 } else if (representation() == kUnboxedMint) {
1230 locs->set_out(0, Location::Pair(Location::RequiresRegister(), 1233 locs->set_out(0, Location::Pair(Location::RequiresRegister(),
1231 Location::RequiresRegister())); 1234 Location::RequiresRegister()));
1235 } else if (representation() == kUnboxedUint32) {
1236 locs->set_out(0, Location::RequiresRegister());
1232 } else { 1237 } else {
1233 ASSERT(representation() == kTagged); 1238 ASSERT(representation() == kTagged);
1234 locs->set_out(0, Location::RequiresRegister()); 1239 locs->set_out(0, Location::RequiresRegister());
1235 } 1240 }
1236 return locs; 1241 return locs;
1237 } 1242 }
1238 1243
1239 1244
1240 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1245 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1241 // The array register points to the backing store for external arrays. 1246 // The array register points to the backing store for external arrays.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 PairLocation* result_pair = locs()->out(0).AsPairLocation(); 1291 PairLocation* result_pair = locs()->out(0).AsPairLocation();
1287 const Register result1 = result_pair->At(0).reg(); 1292 const Register result1 = result_pair->At(0).reg();
1288 const Register result2 = result_pair->At(1).reg(); 1293 const Register result2 = result_pair->At(1).reg();
1289 switch (class_id()) { 1294 switch (class_id()) {
1290 case kTypedDataInt32ArrayCid: 1295 case kTypedDataInt32ArrayCid:
1291 // Load low word. 1296 // Load low word.
1292 __ ldr(result1, element_address); 1297 __ ldr(result1, element_address);
1293 // Sign extend into high word. 1298 // Sign extend into high word.
1294 __ SignFill(result2, result1); 1299 __ SignFill(result2, result1);
1295 break; 1300 break;
1296 case kTypedDataUint32ArrayCid:
1297 // Load low word.
1298 __ ldr(result1, element_address);
1299 // Zero high word.
1300 __ eor(result2, result2, Operand(result2));
1301 break;
1302 default: 1301 default:
1303 UNREACHABLE(); 1302 UNREACHABLE();
1304 break; 1303 break;
1305 } 1304 }
1306 return; 1305 return;
1307 } 1306 }
1308 1307
1308 if (representation() == kUnboxedUint32) {
1309 ASSERT(class_id() == kTypedDataUint32ArrayCid);
1310 const Register result = locs()->out(0).reg();
1311 __ ldr(result, element_address);
1312 return;
1313 }
1314
1309 ASSERT(representation() == kTagged); 1315 ASSERT(representation() == kTagged);
1310 1316
1311 const Register result = locs()->out(0).reg(); 1317 const Register result = locs()->out(0).reg();
1312 switch (class_id()) { 1318 switch (class_id()) {
1313 case kTypedDataInt8ArrayCid: 1319 case kTypedDataInt8ArrayCid:
1314 ASSERT(index_scale() == 1); 1320 ASSERT(index_scale() == 1);
1315 __ ldrsb(result, element_address); 1321 __ ldrsb(result, element_address);
1316 __ SmiTag(result); 1322 __ SmiTag(result);
1317 break; 1323 break;
1318 case kTypedDataUint8ArrayCid: 1324 case kTypedDataUint8ArrayCid:
(...skipping 5700 matching lines...) Expand 10 before | Expand all | Expand 10 after
7019 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); 7025 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
7020 #if defined(DEBUG) 7026 #if defined(DEBUG)
7021 __ LoadImmediate(R4, kInvalidObjectPointer); 7027 __ LoadImmediate(R4, kInvalidObjectPointer);
7022 __ LoadImmediate(R5, kInvalidObjectPointer); 7028 __ LoadImmediate(R5, kInvalidObjectPointer);
7023 #endif 7029 #endif
7024 } 7030 }
7025 7031
7026 } // namespace dart 7032 } // namespace dart
7027 7033
7028 #endif // defined TARGET_ARCH_ARM 7034 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_optimizer.cc ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698