Revision: 4562
Author: [email protected]
Date: Mon May  3 02:54:48 2010
Log: X64: Use allocation with no scratch registers to avoid push/pop.
Minor prettifications.

Review URL: http://codereview.chromium.org/1862001
http://code.google.com/p/v8/source/detail?r=4562

Modified:
 /branches/bleeding_edge/src/x64/codegen-x64.cc
 /branches/bleeding_edge/src/x64/macro-assembler-x64.cc

=======================================
--- /branches/bleeding_edge/src/x64/codegen-x64.cc      Mon May  3 01:46:23 2010
+++ /branches/bleeding_edge/src/x64/codegen-x64.cc      Mon May  3 02:54:48 2010
@@ -5969,7 +5969,7 @@
       || (op_ ==Token::SUB)
       || (op_ == Token::MUL)
       || (op_ == Token::DIV)) {
-    Label call_runtime, after_alloc_failure;
+    Label call_runtime;
     Label left_smi, right_smi, load_right, do_op;
     __ JumpIfSmi(left_, &left_smi);
     __ CompareRoot(FieldOperand(left_, HeapObject::kMapOffset),
@@ -5987,9 +5987,7 @@
     __ Integer32ToSmi(left_, left_);
     if (mode_ == OVERWRITE_LEFT) {
       Label alloc_failure;
-      __ push(left_);
-      __ AllocateHeapNumber(dst_, left_, &after_alloc_failure);
-      __ pop(left_);
+      __ AllocateHeapNumber(dst_, no_reg, &call_runtime);
     }

     __ bind(&load_right);
@@ -6002,9 +6000,7 @@
       __ movq(dst_, right_);
     } else if (mode_ == NO_OVERWRITE) {
       Label alloc_failure;
-      __ push(left_);
-      __ AllocateHeapNumber(dst_, left_, &after_alloc_failure);
-      __ pop(left_);
+      __ AllocateHeapNumber(dst_, no_reg, &call_runtime);
     }
     __ jmp(&do_op);

@@ -6014,9 +6010,7 @@
     __ Integer32ToSmi(right_, right_);
     if (mode_ == OVERWRITE_RIGHT || mode_ == NO_OVERWRITE) {
       Label alloc_failure;
-      __ push(left_);
-      __ AllocateHeapNumber(dst_, left_, &after_alloc_failure);
-      __ pop(left_);
+      __ AllocateHeapNumber(dst_, no_reg, &call_runtime);
     }

     __ bind(&do_op);
@@ -6030,8 +6024,6 @@
     __ movsd(FieldOperand(dst_, HeapNumber::kValueOffset), xmm0);
     __ jmp(&done);

-    __ bind(&after_alloc_failure);
-    __ pop(left_);
     __ bind(&call_runtime);
   }
   GenericBinaryOpStub stub(op_, mode_, NO_SMI_CODE_IN_STUB);
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Mon May 3 00:44:55 2010 +++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Mon May 3 02:54:48 2010
@@ -2356,18 +2356,17 @@
     return;
   }

- // Move address of new object to result. Use scratch register if available.
-  if (!scratch.is_valid()) {
-    if (result.is(rax)) {
-      load_rax(new_space_allocation_top);
-    } else {
-      movq(kScratchRegister, new_space_allocation_top);
-      movq(result, Operand(kScratchRegister, 0));
-    }
-  } else {
+ // Move address of new object to result. Use scratch register if available,
+  // and keep address in scratch until call to UpdateAllocationTopHelper.
+  if (scratch.is_valid()) {
     ASSERT(!scratch.is(result_end));
     movq(scratch, new_space_allocation_top);
     movq(result, Operand(scratch, 0));
+  } else if (result.is(rax)) {
+    load_rax(new_space_allocation_top);
+  } else {
+    movq(kScratchRegister, new_space_allocation_top);
+    movq(result, Operand(kScratchRegister, 0));
   }
 }

@@ -2388,11 +2387,11 @@
     store_rax(new_space_allocation_top);
   } else {
     // Register required - use scratch provided if available.
-    if (!scratch.is_valid()) {
+    if (scratch.is_valid()) {
+      movq(Operand(scratch, 0), result_end);
+    } else {
       movq(kScratchRegister, new_space_allocation_top);
       movq(Operand(kScratchRegister, 0), result_end);
-    } else {
-      movq(Operand(scratch, 0), result_end);
     }
   }
 }
@@ -2415,7 +2414,11 @@

   Register top_reg = result_end.is_valid() ? result_end : result;

-  lea(top_reg, Operand(result, object_size));
+  if (top_reg.is(result)) {
+    addq(top_reg, Immediate(object_size));
+  } else {
+    lea(top_reg, Operand(result, object_size));
+  }
   movq(kScratchRegister, new_space_allocation_limit);
   cmpq(top_reg, Operand(kScratchRegister, 0));
   j(above, gc_required);

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to