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

Unified Diff: runtime/vm/opt_code_generator_ia32.cc

Issue 10450014: Request for comments on overall approach. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: fix scavenger and freelist handling Created 8 years, 7 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/opt_code_generator_ia32.cc
diff --git a/runtime/vm/opt_code_generator_ia32.cc b/runtime/vm/opt_code_generator_ia32.cc
index 640ffd5920553940a8de3e891a8e02e18f33d2bd..51802a83ce68b92dc63a4e521fdadf4bf0cb9b91 100644
--- a/runtime/vm/opt_code_generator_ia32.cc
+++ b/runtime/vm/opt_code_generator_ia32.cc
@@ -983,8 +983,7 @@ void OptimizingCodeGenerator::GenerateMintBinaryOp(BinaryOpNode* node,
__ testl(EAX, Immediate(kSmiTagMask));
__ j(ZERO, &is_smi);
- __ movl(EBX, FieldAddress(EAX, Object::class_offset()));
- __ CompareObject(EBX, Class::ZoneHandle(object_store->mint_class()));
+ __ CompareClassOf(EAX, Class::Handle(object_store->mint_class()), EBX);
__ j(NOT_EQUAL, deopt_blob->label());
// Load lower Mint word, convert to Smi. It is OK to loose bits.
@@ -1049,8 +1048,7 @@ void OptimizingCodeGenerator::CheckIfDoubleOrSmi(Register reg,
Label* not_double_or_smi) {
__ testl(reg, Immediate(kSmiTagMask));
__ j(ZERO, is_smi);
- __ movl(temp, FieldAddress(reg, Object::class_offset()));
- __ CompareObject(temp, double_class_);
+ __ CompareClassOf(reg, double_class_, temp);
__ j(NOT_EQUAL, not_double_or_smi);
}
@@ -1417,14 +1415,14 @@ void OptimizingCodeGenerator::InlineInstanceGettersWithSameTarget(
__ j(ZERO, deopt_blob->label());
}
- __ movl(EAX, FieldAddress(EBX, Object::class_offset()));
+ __ LoadObjectClassId(EAX, EBX);
const ICData& ic_data = node->ic_data();
Function& target = Function::Handle();
Label load_field;
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- Class& cls = Class::ZoneHandle();
+ Class& cls = Class::Handle();
ic_data.GetOneClassCheckAt(i, &cls, &target);
- __ CompareObject(EAX, cls);
+ __ CompareClassId(EAX, cls);
Ivan Posva 2012/05/26 04:34:46 Not sure about others, but I find this more readab
Vyacheslav Egorov (Google) 2012/05/26 16:48:22 ok. I will inline them. I agree that macros does n
if (i == (ic_data.NumberOfChecks() - 1)) {
__ j(NOT_EQUAL, deopt_blob->label());
} else {
@@ -1627,7 +1625,7 @@ void OptimizingCodeGenerator::InlineInstanceSetter(AstNode* node,
__ testl(recv_reg, Immediate(kSmiTagMask));
__ j(ZERO, deopt_blob->label());
}
- __ movl(EBX, FieldAddress(recv_reg, Object::class_offset()));
+ __ LoadObjectClassId(EBX, recv_reg);
// Initialize setter arguments, but leave the class and target fields NULL.
InstanceSetterArgs setter_args =
{NULL, NULL, &field_name, recv_reg, value_reg,
@@ -1636,7 +1634,7 @@ void OptimizingCodeGenerator::InlineInstanceSetter(AstNode* node,
if (unique_target) {
Label store_field;
for (intptr_t i = 0; i < classes.length(); i++) {
- __ CompareObject(EBX, *classes[i]);
+ __ CompareClassId(EBX, *classes[i]);
if (i == (classes.length() - 1)) {
__ j(NOT_EQUAL, deopt_blob->label());
} else {
@@ -1990,10 +1988,10 @@ bool OptimizingCodeGenerator::GenerateEqualityComparison(ComparisonNode* node) {
// Smi causes deoptimization.
__ testl(EAX, Immediate(kSmiTagMask));
__ j(ZERO, deopt_blob->label());
- __ movl(EBX, FieldAddress(EAX, Object::class_offset()));
+ __ LoadObjectClassId(EBX, EAX);
for (intptr_t i = 0; i < num_classes; i++) {
const Class& cls = *(*classes)[i];
- __ CompareObject(EBX, cls);
+ __ CompareClassId(EBX, cls);
if (i == (num_classes - 1)) {
__ j(NOT_EQUAL, deopt_blob->label());
} else {
@@ -2171,8 +2169,7 @@ void OptimizingCodeGenerator::VisitLoadIndexedNode(LoadIndexedNode* node) {
if (!array_info.IsClass(test_class)) {
__ testl(EBX, Immediate(kSmiTagMask)); // Deoptimize if Smi.
__ j(ZERO, deopt_blob->label());
- __ movl(EAX, FieldAddress(EBX, Object::class_offset()));
- __ CompareObject(EAX, test_class);
+ __ CompareClassOf(EBX, test_class, EAX);
__ j(NOT_EQUAL, deopt_blob->label());
PropagateBackLocalClass(node->array(), test_class);
}
@@ -2209,8 +2206,7 @@ void OptimizingCodeGenerator::VisitLoadIndexedNode(LoadIndexedNode* node) {
if (!array_info.IsClass(growable_object_array_class_)) {
__ testl(EDX, Immediate(kSmiTagMask));
__ j(ZERO, deopt_blob->label()); // Array is Smi.
- __ movl(EBX, FieldAddress(EDX, Object::class_offset()));
- __ CompareObject(EBX, growable_object_array_class_);
+ __ CompareClassOf(EDX, growable_object_array_class_, EBX);
__ j(NOT_EQUAL, deopt_blob->label()); // Not GrowableObjectArray.
PropagateBackLocalClass(node->array(), growable_object_array_class_);
}
@@ -2277,8 +2273,7 @@ void OptimizingCodeGenerator::VisitStoreIndexedNode(StoreIndexedNode* node) {
if (class_of_this_array.raw() != object_array_class.raw()) {
__ testl(EAX, Immediate(kSmiTagMask));
__ j(ZERO, deopt_blob->label()); // Array is smi -> deopt.
- __ movl(EDX, FieldAddress(EAX, Object::class_offset()));
- __ CompareObject(EDX, object_array_class);
+ __ CompareClassOf(EAX, object_array_class, EDX);
__ j(NOT_EQUAL, deopt_blob->label()); // Not ObjectArray -> deopt.
PropagateBackLocalClass(node->array(), object_array_class);
}
@@ -2318,8 +2313,7 @@ void OptimizingCodeGenerator::VisitStoreIndexedNode(StoreIndexedNode* node) {
if (class_of_this_array.raw() != growable_object_array_class_.raw()) {
__ testl(EAX, Immediate(kSmiTagMask));
__ j(ZERO, deopt_blob->label()); // Array is smi -> deopt.
- __ movl(EDX, FieldAddress(EAX, Object::class_offset()));
- __ CompareObject(EDX, growable_object_array_class_);
+ __ CompareClassOf(EAX, growable_object_array_class_, EDX);
__ j(NOT_EQUAL, deopt_blob->label()); // Not GrowableObjectArray.
PropagateBackLocalClass(node->array(), growable_object_array_class_);
}
@@ -2647,11 +2641,11 @@ void OptimizingCodeGenerator::GenerateCheckedInstanceCalls(
} else {
// Receiver cannot be Smi, no need to test it.
}
- __ movl(EAX, FieldAddress(EAX, Object::class_offset())); // Receiver's class.
+ __ LoadObjectClassId(EAX, EAX); // Receiver's class.
for (intptr_t i = start_ix; i < classes.length(); i++) {
const Class& cls = *classes[i];
const Function& target = *targets[i];
- __ CompareObject(EAX, cls);
+ __ CompareClassId(EAX, cls);
if (i == (classes.length() - 1)) {
// Last check.
DeoptimizationBlob* deopt_blob =

Powered by Google App Engine
This is Rietveld 408576698