Index: src/ia32/lithium-codegen-ia32.cc |
=================================================================== |
--- src/ia32/lithium-codegen-ia32.cc (revision 9305) |
+++ src/ia32/lithium-codegen-ia32.cc (working copy) |
@@ -1583,23 +1583,33 @@ |
} |
-void LCodeGen::DoIsNullAndBranch(LIsNullAndBranch* instr) { |
+void LCodeGen::DoIsNilAndBranch(LIsNilAndBranch* instr) { |
Register reg = ToRegister(instr->InputAt(0)); |
+ int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- // TODO(fsc): If the expression is known to be a smi, then it's |
- // definitely not null. Jump to the false block. |
+ // If the expression is known to be untagged or a smi, then it's definitely |
+ // not null, and it can't be a an undetectable object. |
+ if (instr->hydrogen()->representation().IsSpecialization() || |
+ instr->hydrogen()->type().IsSmi()) { |
+ EmitGoto(false_block); |
+ return; |
+ } |
int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- |
- __ cmp(reg, factory()->null_value()); |
- if (instr->is_strict()) { |
+ Handle<Object> nil_value = instr->nil() == kNullValue ? |
+ factory()->null_value() : |
+ factory()->undefined_value(); |
+ __ cmp(reg, nil_value); |
+ if (instr->kind() == kStrictEquality) { |
EmitBranch(true_block, false_block, equal); |
} else { |
+ Handle<Object> other_nil_value = instr->nil() == kNullValue ? |
+ factory()->undefined_value() : |
+ factory()->null_value(); |
Label* true_label = chunk_->GetAssemblyLabel(true_block); |
Label* false_label = chunk_->GetAssemblyLabel(false_block); |
__ j(equal, true_label); |
- __ cmp(reg, factory()->undefined_value()); |
+ __ cmp(reg, other_nil_value); |
__ j(equal, true_label); |
__ JumpIfSmi(reg, false_label); |
// Check for undetectable objects by looking in the bit field in |