Commit e09c4f20 authored by whesse@chromium.org's avatar whesse@chromium.org

Add unary not operator to fast compiler.

Review URL: http://codereview.chromium.org/343057

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3193 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent e4f5b74d
......@@ -901,6 +901,71 @@ void FastCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
}
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);
__ LoadRoot(ip, Heap::kTrueValueRootIndex);
__ push(ip);
__ jmp(&done);
__ bind(&push_false);
__ LoadRoot(ip, Heap::kFalseValueRootIndex);
__ push(ip);
__ 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);
__ LoadRoot(ip, Heap::kTrueValueRootIndex);
__ push(ip);
__ jmp(saved_true);
break;
case Expression::kTestValue:
true_label_ = &push_false;
false_label_ = saved_true;
Visit(expr->expression());
__ bind(&push_false);
__ LoadRoot(ip, Heap::kFalseValueRootIndex);
__ push(ip);
__ jmp(saved_false);
break;
}
true_label_ = saved_true;
false_label_ = saved_false;
break;
}
default:
UNREACHABLE();
}
......
......@@ -837,6 +837,9 @@ void CodeGenSelector::VisitUnaryOperation(UnaryOperation* expr) {
case Token::VOID:
ProcessExpression(expr->expression(), Expression::kEffect);
break;
case Token::NOT:
ProcessExpression(expr->expression(), Expression::kTest);
break;
default:
BAILOUT("UnaryOperation");
}
......
......@@ -926,6 +926,67 @@ void FastCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
}
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);
__ push(Immediate(Factory::true_value()));
__ jmp(&done);
__ bind(&push_false);
__ push(Immediate(Factory::false_value()));
__ 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);
__ push(Immediate(Factory::true_value()));
__ jmp(saved_true);
break;
case Expression::kTestValue:
true_label_ = &push_false;
false_label_ = saved_true;
Visit(expr->expression());
__ bind(&push_false);
__ push(Immediate(Factory::false_value()));
__ jmp(saved_false);
break;
}
true_label_ = saved_true;
false_label_ = saved_false;
break;
}
default:
UNREACHABLE();
}
......
......@@ -942,6 +942,67 @@ void FastCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
}
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();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment