Index: src/codegen-ia32.cc |
=================================================================== |
--- src/codegen-ia32.cc (revision 732) |
+++ src/codegen-ia32.cc (working copy) |
@@ -3522,54 +3522,47 @@ |
Expression* right = node->right(); |
Token::Value op = node->op(); |
- // NOTE: To make null checks efficient, we check if either left or |
- // right is the literal 'null'. If so, we optimize the code by |
- // inlining a null check instead of calling the (very) general |
- // runtime routine for checking equality. |
- |
+ // To make null checks efficient, we check if either left or right is the |
+ // literal 'null'. If so, we optimize the code by inlining a null check |
+ // instead of calling the (very) general runtime routine for checking |
+ // equality. |
if (op == Token::EQ || op == Token::EQ_STRICT) { |
bool left_is_null = |
- left->AsLiteral() != NULL && left->AsLiteral()->IsNull(); |
+ left->AsLiteral() != NULL && left->AsLiteral()->IsNull(); |
bool right_is_null = |
- right->AsLiteral() != NULL && right->AsLiteral()->IsNull(); |
- // The 'null' value is only equal to 'null' or 'undefined'. |
+ right->AsLiteral() != NULL && right->AsLiteral()->IsNull(); |
+ // The 'null' value can only be equal to 'null' or 'undefined'. |
if (left_is_null || right_is_null) { |
Load(left_is_null ? right : left); |
- Label exit, undetectable; |
frame_->Pop(eax); |
__ cmp(eax, Factory::null_value()); |
- // The 'null' value is only equal to 'undefined' if using |
- // non-strict comparisons. |
+ // The 'null' value is only equal to 'undefined' if using non-strict |
+ // comparisons. |
if (op != Token::EQ_STRICT) { |
- __ j(equal, &exit); |
+ __ j(equal, true_target()); |
+ |
__ cmp(eax, Factory::undefined_value()); |
+ __ j(equal, true_target()); |
- // NOTE: it can be an undetectable object. |
- __ j(equal, &exit); |
__ test(eax, Immediate(kSmiTagMask)); |
+ __ j(equal, false_target()); |
- __ j(not_equal, &undetectable); |
- __ jmp(false_target()); |
- |
- __ bind(&undetectable); |
- __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset)); |
- __ movzx_b(ecx, FieldOperand(edx, Map::kBitFieldOffset)); |
- __ and_(ecx, 1 << Map::kIsUndetectable); |
- __ cmp(ecx, 1 << Map::kIsUndetectable); |
+ // It can be an undetectable object. |
+ __ mov(eax, FieldOperand(eax, HeapObject::kMapOffset)); |
+ __ movzx_b(eax, FieldOperand(eax, Map::kBitFieldOffset)); |
+ __ and_(eax, 1 << Map::kIsUndetectable); |
+ __ cmp(eax, 1 << Map::kIsUndetectable); |
} |
- __ bind(&exit); |
- |
cc_reg_ = equal; |
return; |
} |
} |
- // NOTE: To make typeof testing for natives implemented in |
- // JavaScript really efficient, we generate special code for |
- // expressions of the form: 'typeof <expression> == <string>'. |
- |
+ // To make typeof testing for natives implemented in JavaScript really |
+ // efficient, we generate special code for expressions of the form: |
+ // 'typeof <expression> == <string>'. |
UnaryOperation* operation = left->AsUnaryOperation(); |
if ((op == Token::EQ || op == Token::EQ_STRICT) && |
(operation != NULL && operation->op() == Token::TYPEOF) && |
@@ -3577,7 +3570,7 @@ |
right->AsLiteral()->handle()->IsString())) { |
Handle<String> check(String::cast(*right->AsLiteral()->handle())); |
- // Load the operand, move it to register edx, and restore TOS. |
+ // Load the operand and move it to register edx. |
LoadTypeofExpression(operation->expression()); |
frame_->Pop(edx); |
@@ -3594,7 +3587,7 @@ |
__ mov(edx, FieldOperand(edx, HeapObject::kMapOffset)); |
- // NOTE: it might be an undetectable string object |
+ // It can be an undetectable string object. |
__ movzx_b(ecx, FieldOperand(edx, Map::kBitFieldOffset)); |
__ and_(ecx, 1 << Map::kIsUndetectable); |
__ cmp(ecx, 1 << Map::kIsUndetectable); |
@@ -3617,7 +3610,7 @@ |
__ test(edx, Immediate(kSmiTagMask)); |
__ j(zero, false_target()); |
- // NOTE: it can be an undetectable object. |
+ // It can be an undetectable object. |
__ mov(edx, FieldOperand(edx, HeapObject::kMapOffset)); |
__ movzx_b(ecx, FieldOperand(edx, Map::kBitFieldOffset)); |
__ and_(ecx, 1 << Map::kIsUndetectable); |
@@ -3641,7 +3634,7 @@ |
__ cmp(edx, Factory::null_value()); |
__ j(equal, true_target()); |
- // NOTE: it might be an undetectable object |
+ // It can be an undetectable object. |
__ movzx_b(edx, FieldOperand(ecx, Map::kBitFieldOffset)); |
__ and_(edx, 1 << Map::kIsUndetectable); |
__ cmp(edx, 1 << Map::kIsUndetectable); |
@@ -3654,8 +3647,8 @@ |
cc_reg_ = less_equal; |
} else { |
- // Uncommon case: Typeof testing against a string literal that |
- // is never returned from the typeof operator. |
+ // Uncommon case: typeof testing against a string literal that is |
+ // never returned from the typeof operator. |
__ jmp(false_target()); |
} |
return; |