| Index: src/x64/fast-codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/fast-codegen-x64.cc (revision 3192)
|
| +++ src/x64/fast-codegen-x64.cc (working copy)
|
| @@ -942,6 +942,67 @@
|
| }
|
| break;
|
|
|
| + case Token::NOT: {
|
| + ASSERT_EQ(Expression::kTest, expr->expression()->context());
|
| +
|
| + Label push_true;
|
| + Label push_false;
|
| + Label done;
|
| + Label* saved_true = true_label_;
|
| + Label* saved_false = false_label_;
|
| + switch (expr->context()) {
|
| + case Expression::kUninitialized:
|
| + UNREACHABLE();
|
| + break;
|
| +
|
| + case Expression::kValue:
|
| + true_label_ = &push_false;
|
| + false_label_ = &push_true;
|
| + Visit(expr->expression());
|
| + __ bind(&push_true);
|
| + __ PushRoot(Heap::kTrueValueRootIndex);
|
| + __ jmp(&done);
|
| + __ bind(&push_false);
|
| + __ PushRoot(Heap::kFalseValueRootIndex);
|
| + __ bind(&done);
|
| + break;
|
| +
|
| + case Expression::kEffect:
|
| + true_label_ = &done;
|
| + false_label_ = &done;
|
| + Visit(expr->expression());
|
| + __ bind(&done);
|
| + break;
|
| +
|
| + case Expression::kTest:
|
| + true_label_ = saved_false;
|
| + false_label_ = saved_true;
|
| + Visit(expr->expression());
|
| + break;
|
| +
|
| + case Expression::kValueTest:
|
| + true_label_ = saved_false;
|
| + false_label_ = &push_true;
|
| + Visit(expr->expression());
|
| + __ bind(&push_true);
|
| + __ PushRoot(Heap::kTrueValueRootIndex);
|
| + __ jmp(saved_true);
|
| + break;
|
| +
|
| + case Expression::kTestValue:
|
| + true_label_ = &push_false;
|
| + false_label_ = saved_true;
|
| + Visit(expr->expression());
|
| + __ bind(&push_false);
|
| + __ PushRoot(Heap::kFalseValueRootIndex);
|
| + __ jmp(saved_false);
|
| + break;
|
| + }
|
| + true_label_ = saved_true;
|
| + false_label_ = saved_false;
|
| + break;
|
| + }
|
| +
|
| default:
|
| UNREACHABLE();
|
| }
|
|
|