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

Unified Diff: runtime/vm/intermediate_language_ia32.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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/intermediate_language_ia32.cc
===================================================================
--- runtime/vm/intermediate_language_ia32.cc (revision 19943)
+++ runtime/vm/intermediate_language_ia32.cc (working copy)
@@ -1102,6 +1102,8 @@
case kFloat32ArrayCid :
case kFloat64ArrayCid :
+ case kTypedDataFloat32ArrayCid:
+ case kTypedDataFloat64ArrayCid:
return CompileType::FromCid(kDoubleCid);
case kInt8ArrayCid:
@@ -1111,12 +1113,21 @@
case kExternalUint8ClampedArrayCid:
case kInt16ArrayCid:
case kUint16ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
case kOneByteStringCid:
case kTwoByteStringCid:
return CompileType::FromCid(kSmiCid);
case kInt32ArrayCid:
case kUint32ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
// Result can be Smi or Mint when boxed.
// Instruction can deoptimize if we optimistically assumed that the result
// fits into Smi.
@@ -1141,16 +1152,27 @@
case kExternalUint8ClampedArrayCid:
case kInt16ArrayCid:
case kUint16ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
case kOneByteStringCid:
case kTwoByteStringCid:
return kTagged;
case kInt32ArrayCid:
case kUint32ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
// Instruction can deoptimize if we optimistically assumed that the result
// fits into Smi.
return CanDeoptimize() ? kTagged : kUnboxedMint;
case kFloat32ArrayCid :
case kFloat64ArrayCid :
+ case kTypedDataFloat32ArrayCid:
+ case kTypedDataFloat64ArrayCid:
return kUnboxedDouble;
default:
UNIMPLEMENTED();
@@ -1192,14 +1214,15 @@
Location index = locs()->in(1);
if ((class_id() == kExternalUint8ArrayCid) ||
- (class_id() == kExternalUint8ClampedArrayCid)) {
+ (class_id() == kExternalUint8ClampedArrayCid) ||
+ (class_id() == kExternalTypedDataUint8ArrayCid) ||
+ (class_id() == kExternalTypedDataUint8ClampedArrayCid)) {
Register result = locs()->out().reg();
const Address& element_address = index.IsRegister()
? FlowGraphCompiler::ExternalElementAddressForRegIndex(
- class_id(), index_scale(), result, index.reg())
+ index_scale(), result, index.reg())
: FlowGraphCompiler::ExternalElementAddressForIntIndex(
- class_id(), index_scale(), result,
- Smi::Cast(index.constant()).Value());
+ index_scale(), result, Smi::Cast(index.constant()).Value());
ASSERT(index_scale() == 1);
if (index.IsRegister()) {
__ SmiUntag(index.reg());
@@ -1226,19 +1249,23 @@
}
switch (class_id()) {
case kInt32ArrayCid:
+ case kTypedDataInt32ArrayCid:
__ movss(result, element_address);
__ pmovsxdq(result, result);
break;
case kUint32ArrayCid:
+ case kTypedDataUint32ArrayCid:
__ xorpd(result, result);
__ movss(result, element_address);
break;
case kFloat32ArrayCid:
+ case kTypedDataFloat32ArrayCid:
// Load single precision float and promote to double.
__ movss(result, element_address);
__ cvtss2sd(result, locs()->out().fpu_reg());
break;
case kFloat64ArrayCid:
+ case kTypedDataFloat64ArrayCid:
__ movsd(result, element_address);
break;
}
@@ -1251,27 +1278,33 @@
}
switch (class_id()) {
case kInt8ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ ASSERT(index_scale() == 1);
+ __ movsxb(result, element_address);
Kevin Millikin (Google) 2013/03/14 10:09:12 Something's wrong with the indentation there. Ext
Florian Schneider 2013/03/14 14:03:09 Done.
+ __ SmiTag(result);
+ break;
case kUint8ArrayCid:
case kUint8ClampedArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
case kOneByteStringCid:
ASSERT(index_scale() == 1);
- if (class_id() == kInt8ArrayCid) {
- __ movsxb(result, element_address);
- } else {
- __ movzxb(result, element_address);
- }
+ __ movzxb(result, element_address);
__ SmiTag(result);
break;
case kInt16ArrayCid:
+ case kTypedDataInt16ArrayCid:
__ movsxw(result, element_address);
__ SmiTag(result);
break;
case kUint16ArrayCid:
+ case kTypedDataUint16ArrayCid:
case kTwoByteStringCid:
__ movzxw(result, element_address);
__ SmiTag(result);
break;
- case kInt32ArrayCid: {
+ case kInt32ArrayCid:
+ case kTypedDataInt32ArrayCid: {
Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptInt32Load);
__ movl(result, element_address);
// Verify that the signed value in 'result' can fit inside a Smi.
@@ -1280,7 +1313,8 @@
__ SmiTag(result);
}
break;
- case kUint32ArrayCid: {
+ case kUint32ArrayCid:
+ case kTypedDataUint32ArrayCid: {
Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptUint32Load);
__ movl(result, element_address);
// Verify that the unsigned value in 'result' can fit inside a Smi.
@@ -1310,12 +1344,23 @@
case kExternalUint8ClampedArrayCid:
case kInt16ArrayCid:
case kUint16ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
return kTagged;
case kInt32ArrayCid:
case kUint32ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
return value()->IsSmiValue() ? kTagged : kUnboxedMint;
case kFloat32ArrayCid :
case kFloat64ArrayCid :
+ case kTypedDataFloat32ArrayCid :
+ case kTypedDataFloat64ArrayCid :
return kUnboxedDouble;
default:
UNIMPLEMENTED();
@@ -1351,23 +1396,32 @@
break;
case kExternalUint8ArrayCid:
case kExternalUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
// Need temp register to load the external array's data array.
locs->AddTemp(Location::RequiresRegister());
// Fall through.
case kInt8ArrayCid:
case kUint8ArrayCid:
case kUint8ClampedArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
// TODO(fschneider): Add location constraint for byte registers (EAX,
// EBX, ECX, EDX) instead of using a fixed register.
locs->set_in(2, Location::FixedRegisterOrSmiConstant(value(), EAX));
break;
case kInt16ArrayCid:
case kUint16ArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
// Writable register because the value must be untagged before storing.
locs->set_in(2, Location::WritableRegister());
break;
case kInt32ArrayCid:
case kUint32ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
// Mints are stored in XMM registers. For smis, use a writable register
// because the value must be untagged before storing.
locs->set_in(2, value()->IsSmiValue()
@@ -1375,10 +1429,12 @@
: Location::RequiresFpuRegister());
break;
case kFloat32ArrayCid:
+ case kTypedDataFloat32ArrayCid:
// Need temp register for float-to-double conversion.
locs->AddTemp(Location::RequiresFpuRegister());
// Fall through.
case kFloat64ArrayCid:
+ case kTypedDataFloat64ArrayCid:
// TODO(srdjan): Support Float64 constants.
locs->set_in(2, Location::RequiresFpuRegister());
break;
@@ -1396,14 +1452,15 @@
Address element_address(kNoRegister, 0);
if ((class_id() == kExternalUint8ArrayCid) ||
- (class_id() == kExternalUint8ClampedArrayCid)) {
+ (class_id() == kExternalUint8ClampedArrayCid) ||
+ (class_id() == kExternalTypedDataUint8ArrayCid) ||
+ (class_id() == kExternalTypedDataUint8ClampedArrayCid)) {
Register temp = locs()->temp(0).reg();
element_address = index.IsRegister()
? FlowGraphCompiler::ExternalElementAddressForRegIndex(
- class_id(), index_scale(), temp, index.reg())
+ index_scale(), temp, index.reg())
: FlowGraphCompiler::ExternalElementAddressForIntIndex(
- class_id(), index_scale(), temp,
- Smi::Cast(index.constant()).Value());
+ index_scale(), temp, Smi::Cast(index.constant()).Value());
__ movl(temp,
FieldAddress(array, ExternalUint8Array::data_offset()));
} else {
@@ -1434,6 +1491,9 @@
case kInt8ArrayCid:
case kUint8ArrayCid:
case kExternalUint8ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
if (locs()->in(2).IsConstant()) {
const Smi& constant = Smi::Cast(locs()->in(2).constant());
__ movb(element_address,
@@ -1445,7 +1505,9 @@
}
break;
case kUint8ClampedArrayCid:
- case kExternalUint8ClampedArrayCid: {
+ case kExternalUint8ClampedArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid: {
if (locs()->in(2).IsConstant()) {
const Smi& constant = Smi::Cast(locs()->in(2).constant());
intptr_t value = constant.Value();
@@ -1475,7 +1537,9 @@
break;
}
case kInt16ArrayCid:
- case kUint16ArrayCid: {
+ case kUint16ArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid: {
Register value = locs()->in(2).reg();
__ SmiUntag(value);
__ movw(element_address, value);
@@ -1483,6 +1547,8 @@
}
case kInt32ArrayCid:
case kUint32ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
if (value()->IsSmiValue()) {
ASSERT(RequiredInputRepresentation(2) == kTagged);
Register value = locs()->in(2).reg();
@@ -1494,12 +1560,14 @@
}
break;
case kFloat32ArrayCid:
+ case kTypedDataFloat32ArrayCid:
// Convert to single precision.
__ cvtsd2ss(locs()->temp(0).fpu_reg(), locs()->in(2).fpu_reg());
// Store.
__ movss(element_address, locs()->temp(0).fpu_reg());
break;
case kFloat64ArrayCid:
+ case kTypedDataFloat64ArrayCid:
__ movsd(element_address, locs()->in(2).fpu_reg());
break;
default:

Powered by Google App Engine
This is Rietveld 408576698