Author: [email protected]
Date: Fri May 15 15:36:26 2009
New Revision: 1978
Modified:
branches/bleeding_edge/src/ia32/codegen-ia32.cc
Log:
- Fix numeric overflow handling when compiling count operations.
In certain situations the overflow checking corrupted the value
being calculated.
Review URL: http://codereview.chromium.org/115423
Modified: branches/bleeding_edge/src/ia32/codegen-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/ia32/codegen-ia32.cc (original)
+++ branches/bleeding_edge/src/ia32/codegen-ia32.cc Fri May 15 15:36:26 2009
@@ -115,6 +115,14 @@
JumpTarget::set_compiling_deferred_code(false);
+#ifdef DEBUG
+ if (strlen(FLAG_stop_at) > 0 &&
+ fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
+ frame_->SpillAll();
+ __ int3();
+ }
+#endif
+
{
HistogramTimerScope codegen_timer(&Counters::code_generation);
CodeGenState state(this);
@@ -128,14 +136,6 @@
allocator_->Initialize();
frame_->Enter();
-#ifdef DEBUG
- if (strlen(FLAG_stop_at) > 0 &&
- fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
- frame_->SpillAll();
- __ int3();
- }
-#endif
-
// Allocate space for locals and initialize them.
frame_->AllocateStackSlots(scope_->num_stack_slots());
// Initialize the function return target after the locals are set
@@ -4878,9 +4878,9 @@
// successfully allocate a temporary byte register.
if (tmp.is_valid()) {
__ setcc(overflow, tmp.reg());
- __ or_(Operand(value.reg()), tmp.reg());
+ __ or_(Operand(tmp.reg()), value.reg());
+ __ test(tmp.reg(), Immediate(kSmiTagMask));
tmp.Unuse();
- __ test(value.reg(), Immediate(kSmiTagMask));
deferred->enter()->Branch(not_zero, &value, not_taken);
} else { // Otherwise we test separately for overflow and smi check.
deferred->enter()->Branch(overflow, &value, not_taken);
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---