Index: runtime/vm/assembler_ia32.cc |
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc |
index 713365db6367d1067a1442869329a423cb0f3bee..04d8aeaeb19f4562b7bd14cbcb37afc6552fd74f 100644 |
--- a/runtime/vm/assembler_ia32.cc |
+++ b/runtime/vm/assembler_ia32.cc |
@@ -2903,26 +2903,54 @@ void Assembler::SmiUntagOrCheckClass(Register object, |
void Assembler::LoadClassIdMayBeSmi(Register result, Register object) { |
- ASSERT(result != object); |
- static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos; |
+ if (result == object) { |
+ Label smi, join; |
- // Make a dummy "Object" whose cid is kSmiCid. |
- movl(result, Immediate(reinterpret_cast<int32_t>(&kSmiCidSource) + 1)); |
+ testl(object, Immediate(kSmiTagMask)); |
+ j(EQUAL, &smi, Assembler::kNearJump); |
+ LoadClassId(result, object); |
+ jmp(&join, Assembler::kNearJump); |
- // Check if object (in tmp) is a Smi. |
- testl(object, Immediate(kSmiTagMask)); |
+ Bind(&smi); |
+ movl(result, Immediate(kSmiCid)); |
- // If the object is not a Smi, use the original object to load the cid. |
- // Otherwise, the dummy object is used, and the result is kSmiCid. |
- cmovne(result, object); |
- LoadClassId(result, result); |
+ Bind(&join); |
+ } else { |
+ ASSERT(result != object); |
+ static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos; |
+ |
+ // Make a dummy "Object" whose cid is kSmiCid. |
+ movl(result, Immediate(reinterpret_cast<int32_t>(&kSmiCidSource) + 1)); |
+ |
+ // Check if object (in tmp) is a Smi. |
+ testl(object, Immediate(kSmiTagMask)); |
+ |
+ // If the object is not a Smi, use the original object to load the cid. |
+ // Otherwise, the dummy object is used, and the result is kSmiCid. |
+ cmovne(result, object); |
+ LoadClassId(result, result); |
+ } |
} |
void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) { |
- LoadClassIdMayBeSmi(result, object); |
- // Tag the result. |
- SmiTag(result); |
+ if (result == object) { |
+ Label smi, join; |
+ |
+ testl(object, Immediate(kSmiTagMask)); |
+ j(EQUAL, &smi, Assembler::kNearJump); |
+ LoadClassId(result, object); |
+ SmiTag(result); |
+ jmp(&join, Assembler::kNearJump); |
+ |
+ Bind(&smi); |
+ movl(result, Immediate(Smi::RawValue(kSmiCid))); |
+ |
+ Bind(&join); |
+ } else { |
+ LoadClassIdMayBeSmi(result, object); |
+ SmiTag(result); |
+ } |
} |