Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 4999) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -748,38 +748,44 @@ |
JumpTarget* false_target) { |
// Note: The generated code snippet does not change stack variables. |
// Only the condition code should be set. |
+ bool known_smi = frame_->KnownSmiAt(0); |
Register tos = frame_->PopToRegister(); |
// Fast case checks |
// Check if the value is 'false'. |
- __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
- __ cmp(tos, ip); |
- false_target->Branch(eq); |
+ if (!known_smi) { |
+ __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
+ __ cmp(tos, ip); |
+ false_target->Branch(eq); |
- // Check if the value is 'true'. |
- __ LoadRoot(ip, Heap::kTrueValueRootIndex); |
- __ cmp(tos, ip); |
- true_target->Branch(eq); |
+ // Check if the value is 'true'. |
+ __ LoadRoot(ip, Heap::kTrueValueRootIndex); |
+ __ cmp(tos, ip); |
+ true_target->Branch(eq); |
- // Check if the value is 'undefined'. |
- __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
- __ cmp(tos, ip); |
- false_target->Branch(eq); |
+ // Check if the value is 'undefined'. |
+ __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
+ __ cmp(tos, ip); |
+ false_target->Branch(eq); |
+ } |
// Check if the value is a smi. |
__ cmp(tos, Operand(Smi::FromInt(0))); |
- false_target->Branch(eq); |
- __ tst(tos, Operand(kSmiTagMask)); |
- true_target->Branch(eq); |
- // Slow case: call the runtime. |
- frame_->EmitPush(tos); |
- frame_->CallRuntime(Runtime::kToBool, 1); |
- // Convert the result (r0) to a condition code. |
- __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
- __ cmp(r0, ip); |
+ if (!known_smi) { |
+ false_target->Branch(eq); |
+ __ tst(tos, Operand(kSmiTagMask)); |
+ true_target->Branch(eq); |
+ // Slow case: call the runtime. |
+ frame_->EmitPush(tos); |
+ frame_->CallRuntime(Runtime::kToBool, 1); |
+ // Convert the result (r0) to a condition code. |
+ __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
+ __ cmp(r0, ip); |
+ } |
+ |
cc_reg_ = ne; |
} |