Reviewers: Kasper Lund, Mads Ager, Kevin Millikin,

Message:
TRB= kasperl | ager | kmillikin



http://codereview.chromium.org/115423/diff/1/2
File src/ia32/codegen-ia32.cc (right):

http://codereview.chromium.org/115423/diff/1/2#newcode118
Line 118: #ifdef DEBUG
This moved up here to be able to stop before any code for the function
is generated. This is not relevant to the actual fix.

Description:
- Fix numeric overflow handling when compiling count operations.
   In certain situations the overflow checking corrupted the value
   being calculated.


Please review this at http://codereview.chromium.org/115423

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
   M     src/ia32/codegen-ia32.cc


Index: src/ia32/codegen-ia32.cc
===================================================================
--- src/ia32/codegen-ia32.cc    (revision 1977)
+++ src/ia32/codegen-ia32.cc    (working copy)
@@ -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
-~----------~----~----~----~------~----~------~--~---

Reply via email to