Revision: 3192
Author: [email protected]
Date: Mon Nov 2 00:44:19 2009
Log: Add conditional expressions (ternary choice operator) to fast compiler.
Review URL: http://codereview.chromium.org/340058
http://code.google.com/p/v8/source/detail?r=3192
Modified:
/branches/bleeding_edge/src/compiler.cc
/branches/bleeding_edge/src/fast-codegen.cc
=======================================
--- /branches/bleeding_edge/src/compiler.cc Fri Oct 30 08:34:09 2009
+++ /branches/bleeding_edge/src/compiler.cc Mon Nov 2 00:44:19 2009
@@ -625,7 +625,11 @@
void CodeGenSelector::VisitConditional(Conditional* expr) {
- BAILOUT("Conditional");
+ ProcessExpression(expr->condition(), Expression::kTest);
+ CHECK_BAILOUT;
+ ProcessExpression(expr->then_expression(), context_);
+ CHECK_BAILOUT;
+ ProcessExpression(expr->else_expression(), context_);
}
=======================================
--- /branches/bleeding_edge/src/fast-codegen.cc Fri Oct 30 08:34:09 2009
+++ /branches/bleeding_edge/src/fast-codegen.cc Mon Nov 2 00:44:19 2009
@@ -380,7 +380,36 @@
void FastCodeGenerator::VisitConditional(Conditional* expr) {
- UNREACHABLE();
+ ASSERT_EQ(Expression::kTest, expr->condition()->context());
+ ASSERT_EQ(expr->context(), expr->then_expression()->context());
+ ASSERT_EQ(expr->context(), expr->else_expression()->context());
+
+
+ Label true_case, false_case, done;
+ Label* saved_true = true_label_;
+ Label* saved_false = false_label_;
+
+ true_label_ = &true_case;
+ false_label_ = &false_case;
+ Visit(expr->condition());
+ true_label_ = saved_true;
+ false_label_ = saved_false;
+
+ __ bind(&true_case);
+ Visit(expr->then_expression());
+ // If control flow falls through Visit, jump to done.
+ if (expr->context() == Expression::kEffect ||
+ expr->context() == Expression::kValue) {
+ __ jmp(&done);
+ }
+
+ __ bind(&false_case);
+ Visit(expr->else_expression());
+ // If control flow falls through Visit, merge it with true case here.
+ if (expr->context() == Expression::kEffect ||
+ expr->context() == Expression::kValue) {
+ __ bind(&done);
+ }
}
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---