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

Unified Diff: runtime/vm/opt_code_generator_ia32.cc

Issue 10458031: In generated code for x64 don't load object's class directly from class_ field. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Eliminate CoreClass helpers on ia32/x64 and use class ids for array classes. 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
« no previous file with comments | « runtime/vm/intrinsifier_ia32.cc ('k') | runtime/vm/stub_code_ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 fe52521f88cd5366461710aa08860c23e47678dd..b2df7cefa0c51a39ab23cb2302ba8606732268be 100644
--- a/runtime/vm/opt_code_generator_ia32.cc
+++ b/runtime/vm/opt_code_generator_ia32.cc
@@ -966,7 +966,6 @@ void OptimizingCodeGenerator::GenerateSmiBinaryOp(BinaryOpNode* node) {
void OptimizingCodeGenerator::GenerateMintBinaryOp(BinaryOpNode* node,
bool allow_smi) {
const char* kOptMessage = "Inline Mint binop.";
- ObjectStore* object_store = Isolate::Current()->object_store();
const Token::Kind kind = node->kind();
if (kind == Token::kBIT_AND) {
TraceOpt(node, kOptMessage);
@@ -983,9 +982,7 @@ void OptimizingCodeGenerator::GenerateMintBinaryOp(BinaryOpNode* node,
__ testl(EAX, Immediate(kSmiTagMask));
__ j(ZERO, &is_smi);
- __ CompareClassOfObject(EAX,
- Class::Handle(object_store->mint_class()),
- EBX);
+ __ CompareClassId(EAX, kMint, EBX);
__ j(NOT_EQUAL, deopt_blob->label());
// Load lower Mint word, convert to Smi. It is OK to loose bits.
@@ -1050,7 +1047,7 @@ void OptimizingCodeGenerator::CheckIfDoubleOrSmi(Register reg,
Label* not_double_or_smi) {
__ testl(reg, Immediate(kSmiTagMask));
__ j(ZERO, is_smi);
- __ CompareClassOfObject(reg, double_class_, temp);
+ __ CompareClassId(reg, kDouble, temp);
__ j(NOT_EQUAL, not_double_or_smi);
}
@@ -1417,7 +1414,7 @@ void OptimizingCodeGenerator::InlineInstanceGettersWithSameTarget(
__ j(ZERO, deopt_blob->label());
}
- __ LoadClassIndexOfObject(EAX, EBX);
+ __ LoadClassId(EAX, EBX);
const ICData& ic_data = node->ic_data();
Function& target = Function::Handle();
Label load_field;
@@ -1627,7 +1624,7 @@ void OptimizingCodeGenerator::InlineInstanceSetter(AstNode* node,
__ testl(recv_reg, Immediate(kSmiTagMask));
__ j(ZERO, deopt_blob->label());
}
- __ LoadClassIndexOfObject(EBX, recv_reg);
+ __ LoadClassId(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,
@@ -1990,7 +1987,7 @@ bool OptimizingCodeGenerator::GenerateEqualityComparison(ComparisonNode* node) {
// Smi causes deoptimization.
__ testl(EAX, Immediate(kSmiTagMask));
__ j(ZERO, deopt_blob->label());
- __ LoadClassIndexOfObject(EBX, EAX);
+ __ LoadClassId(EBX, EAX);
for (intptr_t i = 0; i < num_classes; i++) {
const Class& cls = *(*classes)[i];
__ cmpl(EBX, Immediate(cls.index()));
@@ -2171,7 +2168,7 @@ void OptimizingCodeGenerator::VisitLoadIndexedNode(LoadIndexedNode* node) {
if (!array_info.IsClass(test_class)) {
__ testl(EBX, Immediate(kSmiTagMask)); // Deoptimize if Smi.
__ j(ZERO, deopt_blob->label());
- __ CompareClassOfObject(EBX, test_class, EAX);
+ __ CompareClassId(EBX, test_class.index(), EAX);
__ j(NOT_EQUAL, deopt_blob->label());
PropagateBackLocalClass(node->array(), test_class);
}
@@ -2208,7 +2205,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.
- __ CompareClassOfObject(EDX, growable_object_array_class_, EBX);
+ __ CompareClassId(EDX, kGrowableObjectArray, EBX);
__ j(NOT_EQUAL, deopt_blob->label()); // Not GrowableObjectArray.
PropagateBackLocalClass(node->array(), growable_object_array_class_);
}
@@ -2275,7 +2272,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.
- __ CompareClassOfObject(EAX, object_array_class, EDX);
+ __ CompareClassId(EAX, kArray, EDX);
__ j(NOT_EQUAL, deopt_blob->label()); // Not ObjectArray -> deopt.
PropagateBackLocalClass(node->array(), object_array_class);
}
@@ -2315,7 +2312,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.
- __ CompareClassOfObject(EAX, growable_object_array_class_, EDX);
+ __ CompareClassId(EAX, kGrowableObjectArray, EDX);
__ j(NOT_EQUAL, deopt_blob->label()); // Not GrowableObjectArray.
PropagateBackLocalClass(node->array(), growable_object_array_class_);
}
@@ -2643,7 +2640,7 @@ void OptimizingCodeGenerator::GenerateCheckedInstanceCalls(
} else {
// Receiver cannot be Smi, no need to test it.
}
- __ LoadClassIndexOfObject(EAX, EAX); // Receiver's class.
+ __ LoadClassId(EAX, EAX); // Receiver's class id.
for (intptr_t i = start_ix; i < classes.length(); i++) {
const Class& cls = *classes[i];
const Function& target = *targets[i];
« no previous file with comments | « runtime/vm/intrinsifier_ia32.cc ('k') | runtime/vm/stub_code_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698