Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Unified Diff: src/codegen-ia32.cc

Issue 8764: Simplify the way we materialize boolean values that are not yet pushed... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/codegen-arm.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/codegen-ia32.cc
===================================================================
--- src/codegen-ia32.cc (revision 668)
+++ src/codegen-ia32.cc (working copy)
@@ -474,44 +474,37 @@
Label false_target;
LoadCondition(x, typeof_state, &true_target, &false_target, false);
+ // Materialize boolean values on the stack frame if necessary.
if (has_cc()) {
- // convert cc_reg_ into a bool
-
- Label loaded, materialize_true;
- __ j(cc_reg_, &materialize_true);
+ // The value we want is in the cc register. Since complicated
+ // conditions can require more than one test, there may also be branches
+ // to true_target and false_target.
+ Label loaded;
+ __ j(cc_reg_, &true_target);
+ __ bind(&false_target);
frame_->Push(Immediate(Factory::false_value()));
__ jmp(&loaded);
- __ bind(&materialize_true);
+ __ bind(&true_target);
frame_->Push(Immediate(Factory::true_value()));
__ bind(&loaded);
cc_reg_ = no_condition;
- }
+ } else {
+ // Optimization of boolean-valued expressions whose value is statically
+ // known may have generated an unconditional jump to either of the
+ // targets (but not both) and failed to leave a value in either the cc
+ // register or on top of the frame.
+ ASSERT(!(true_target.is_linked() && false_target.is_linked()));
- if (true_target.is_linked() || false_target.is_linked()) {
- // we have at least one condition value
- // that has been "translated" into a branch,
- // thus it needs to be loaded explicitly again
- Label loaded;
- __ jmp(&loaded); // don't lose current TOS
- bool both = true_target.is_linked() && false_target.is_linked();
- // reincarnate "true", if necessary
if (true_target.is_linked()) {
__ bind(&true_target);
frame_->Push(Immediate(Factory::true_value()));
}
- // if both "true" and "false" need to be reincarnated,
- // jump across code for "false"
- if (both)
- __ jmp(&loaded);
- // reincarnate "false", if necessary
+
if (false_target.is_linked()) {
__ bind(&false_target);
frame_->Push(Immediate(Factory::false_value()));
}
- // everything is loaded at this point
- __ bind(&loaded);
}
- ASSERT(!has_cc());
}
« no previous file with comments | « src/codegen-arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698