| 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
|
|
|