Chromium Code Reviews| Index: src/codegen-ia32.cc |
| =================================================================== |
| --- src/codegen-ia32.cc (revision 1313) |
| +++ src/codegen-ia32.cc (working copy) |
| @@ -1190,12 +1190,20 @@ |
| deferred->enter()->Branch(not_zero, &operand, not_taken); |
| frame_->Spill(operand.reg()); |
| if (op == Token::BIT_AND) { |
| - __ and_(Operand(operand.reg()), Immediate(value)); |
| + if (int_value == 0) { |
| + __ xor_(Operand(operand.reg()), operand.reg()); |
| + } else { |
| + __ and_(Operand(operand.reg()), Immediate(value)); |
| + } |
| } else if (op == Token::BIT_XOR) { |
| - __ xor_(Operand(operand.reg()), Immediate(value)); |
| + if (int_value != 0) { |
| + __ xor_(Operand(operand.reg()), Immediate(value)); |
| + } |
| } else { |
| ASSERT(op == Token::BIT_OR); |
| - __ or_(Operand(operand.reg()), Immediate(value)); |
| + if (int_value != 0) { |
| + __ or_(Operand(opernand.reg()), Immediate(value)); |
|
Lasse Reichstein
2009/02/19 12:19:37
"opernand" typo?
Kevin Millikin (Chromium)
2009/02/19 12:21:06
Duh. Thanks.
|
| + } |
| } |
| deferred->BindExit(&operand); |
| frame_->Push(&operand); |
| @@ -4121,6 +4129,23 @@ |
| Result answer = frame_->CallRuntime(Runtime::kTypeof, 1); |
| frame_->Push(&answer); |
| + } else if (op == Token::VOID) { |
| + Expression* expression = node->expression(); |
| + if (expression && expression->AsLiteral() && ( |
| + expression->AsLiteral()->IsTrue() || |
| + expression->AsLiteral()->IsFalse() || |
| + expression->AsLiteral()->handle()->IsNumber() || |
| + expression->AsLiteral()->handle()->IsString() || |
| + expression->AsLiteral()->handle()->IsJSRegExp() || |
| + expression->AsLiteral()->IsNull())) { |
| + // Omit evaluating the value of the primitive literal. |
| + // It will be discarded anyway, and can have no side effect. |
| + frame_->Push(Factory::undefined_value()); |
| + } else { |
| + Load(node->expression()); |
| + frame_->SetElementAt(0, Factory::undefined_value()); |
| + } |
| + |
| } else { |
| Load(node->expression()); |
| switch (op) { |
| @@ -4164,11 +4189,6 @@ |
| break; |
| } |
| - case Token::VOID: { |
| - frame_->SetElementAt(0, Factory::undefined_value()); |
| - break; |
| - } |
| - |
| case Token::ADD: { |
| // Smi check. |
| JumpTarget continue_label(this); |