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

Unified Diff: runtime/vm/intrinsifier_ia32.cc

Issue 12547018: Add the allocator intrinsics for dart:typeddata implementation. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: 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
« no previous file with comments | « runtime/vm/intrinsifier_arm.cc ('k') | runtime/vm/intrinsifier_mips.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intrinsifier_ia32.cc
===================================================================
--- runtime/vm/intrinsifier_ia32.cc (revision 19667)
+++ runtime/vm/intrinsifier_ia32.cc (working copy)
@@ -467,7 +467,7 @@
}
-#define TYPED_ARRAY_ALLOCATION(type_name, scale_factor) \
+#define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_factor) \
Label fall_through; \
const intptr_t kArrayLengthStackOffset = 1 * kWordSize; \
__ movl(EDI, Address(ESP, kArrayLengthStackOffset)); /* Array length. */ \
@@ -480,7 +480,7 @@
__ SmiUntag(EDI); \
/* Check for maximum allowed length. */ \
/* EDI: untagged array length. */ \
- __ cmpl(EDI, Immediate(type_name::kMaxElements)); \
+ __ cmpl(EDI, Immediate(max_len)); \
__ j(GREATER, &fall_through); \
const intptr_t fixed_size = sizeof(Raw##type_name) + kObjectAlignment - 1; \
__ leal(EDI, Address(EDI, scale_factor, fixed_size)); \
@@ -522,7 +522,7 @@
__ Bind(&done); \
\
/* Get the class index and insert it into the tags. */ \
- __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(k##type_name##Cid))); \
+ __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cid))); \
__ movl(FieldAddress(EAX, type_name::tags_offset()), EDI); /* Tags. */ \
} \
/* Set the length field. */ \
@@ -553,148 +553,80 @@
__ Bind(&fall_through); \
-bool Intrinsifier::Int8Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int8Array, TIMES_1);
- return false;
+#define SCALARLIST_ALLOCATOR(clazz, scale) \
+bool Intrinsifier::clazz##_new(Assembler* assembler) { \
+ TYPED_ARRAY_ALLOCATION(clazz, k##clazz##Cid, clazz::kMaxElements, scale); \
+ return false; \
+} \
+bool Intrinsifier::clazz##_factory(Assembler* assembler) { \
+ TYPED_ARRAY_ALLOCATION(clazz, k##clazz##Cid, clazz::kMaxElements, scale); \
+ return false; \
}
-bool Intrinsifier::Int8Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int8Array, TIMES_1);
- return false;
-}
+SCALARLIST_ALLOCATOR(Int8Array, TIMES_1)
+SCALARLIST_ALLOCATOR(Uint8Array, TIMES_1)
+SCALARLIST_ALLOCATOR(Uint8ClampedArray, TIMES_1)
+SCALARLIST_ALLOCATOR(Int16Array, TIMES_2)
+SCALARLIST_ALLOCATOR(Uint16Array, TIMES_2)
+SCALARLIST_ALLOCATOR(Int32Array, TIMES_4)
+SCALARLIST_ALLOCATOR(Uint32Array, TIMES_4)
+SCALARLIST_ALLOCATOR(Int64Array, TIMES_8)
+SCALARLIST_ALLOCATOR(Uint64Array, TIMES_8)
+SCALARLIST_ALLOCATOR(Float32Array, TIMES_4)
+SCALARLIST_ALLOCATOR(Float64Array, TIMES_8)
-bool Intrinsifier::Uint8Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint8Array, TIMES_1);
- return false;
-}
-
-
-bool Intrinsifier::Uint8Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint8Array, TIMES_1);
- return false;
-}
-
-
-bool Intrinsifier::Uint8ClampedArray_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint8ClampedArray, TIMES_1);
- return false;
-}
-
-
-bool Intrinsifier::Uint8ClampedArray_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint8ClampedArray, TIMES_1);
- return false;
-}
-
-
-bool Intrinsifier::Int16Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int16Array, TIMES_2);
- return false;
-}
-
-
-bool Intrinsifier::Int16Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int16Array, TIMES_2);
- return false;
-}
-
-
-bool Intrinsifier::Uint16Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint16Array, TIMES_2);
- return false;
-}
-
-
-bool Intrinsifier::Uint16Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint16Array, TIMES_2);
- return false;
-}
-
-
-bool Intrinsifier::Int32Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int32Array, TIMES_4);
- return false;
-}
-
-
-bool Intrinsifier::Int32Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int32Array, TIMES_4);
- return false;
-}
-
-
-bool Intrinsifier::Uint32Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint32Array, TIMES_4);
- return false;
-}
-
-
-bool Intrinsifier::Uint32Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint32Array, TIMES_4);
- return false;
-}
-
-
bool Intrinsifier::Int64Array_getIndexed(Assembler* assembler) {
return false;
}
-bool Intrinsifier::Int64Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int64Array, TIMES_8);
- return false;
-}
-
-
-bool Intrinsifier::Int64Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Int64Array, TIMES_8);
- return false;
-}
-
-
bool Intrinsifier::Uint64Array_getIndexed(Assembler* assembler) {
return false;
}
-bool Intrinsifier::Uint64Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint64Array, TIMES_8);
- return false;
+// Gets the length of a TypedData.
+bool Intrinsifier::TypedData_getLength(Assembler* assembler) {
+ __ movl(EAX, Address(ESP, + 1 * kWordSize));
+ __ movl(EAX, FieldAddress(EAX, TypedData::length_offset()));
+ __ ret();
+ return true;
}
-bool Intrinsifier::Uint64Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Uint64Array, TIMES_8);
- return false;
-}
+static ScaleFactor GetScaleFactor(intptr_t size) {
+ switch (size) {
+ case 1: return TIMES_1;
+ case 2: return TIMES_2;
+ case 4: return TIMES_4;
+ case 8: return TIMES_8;
+ }
+ UNREACHABLE();
+ return static_cast<ScaleFactor>(0);
+};
srdjan 2013/03/08 17:40:24 Maybe we could factor this out. There are 3 identi
siva 2013/03/09 00:02:48 Good idea, In an new CL I will factor this into Ut
-bool Intrinsifier::Float32Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Float32Array, TIMES_4);
- return false;
+#define TYPEDDATA_ALLOCATOR(clazz) \
+bool Intrinsifier::TypedData_##clazz##_new(Assembler* assembler) { \
+ intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid); \
+ intptr_t max_len = kSmiMax / size; \
srdjan 2013/03/08 17:40:24 max_len may be needed by other parts of code. Plea
siva 2013/03/09 00:02:48 I have added TypedData::MaxElements which computes
+ ScaleFactor scale = GetScaleFactor(size); \
+ TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale); \
+ return false; \
+} \
+bool Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) { \
+ intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid); \
+ intptr_t max_len = kSmiMax / size; \
+ ScaleFactor scale = GetScaleFactor(size); \
+ TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale); \
+ return false; \
}
+CLASS_LIST_TYPED_DATA(TYPEDDATA_ALLOCATOR)
+#undef TYPEDDATA_ALLOCATOR
-bool Intrinsifier::Float32Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Float32Array, TIMES_4);
- return false;
-}
-
-
-bool Intrinsifier::Float64Array_new(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Float64Array, TIMES_8);
- return false;
-}
-
-
-bool Intrinsifier::Float64Array_factory(Assembler* assembler) {
- TYPED_ARRAY_ALLOCATION(Float64Array, TIMES_8);
- return false;
-}
-
-
// Tests if two top most arguments are smis, jumps to label not_smi if not.
// Topmost argument is in EAX.
static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
« no previous file with comments | « runtime/vm/intrinsifier_arm.cc ('k') | runtime/vm/intrinsifier_mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698