Revision: 10335
Author:   [email protected]
Date:     Thu Jan  5 01:26:15 2012
Log: MIPS: Avoid embedding new space objects into code objects in the lithium gap resolver.

Port r10301 (c91aeb4c).

BUG=
TEST=

Review URL: http://codereview.chromium.org/9032005
Patch from Daniel Kalmar <[email protected]>.
http://code.google.com/p/v8/source/detail?r=10335

Modified:
 /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc
 /branches/bleeding_edge/src/mips/lithium-codegen-mips.h
 /branches/bleeding_edge/src/mips/lithium-gap-resolver-mips.cc
 /branches/bleeding_edge/src/mips/macro-assembler-mips.h

=======================================
--- /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Thu Dec 22 08:23:47 2011 +++ /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Thu Jan 5 01:26:15 2012
@@ -351,6 +351,18 @@
   UNREACHABLE();
   return dbl_scratch;
 }
+
+
+Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const {
+  Handle<Object> literal = chunk_->LookupLiteral(op);
+  ASSERT(chunk_->LookupLiteralRepresentation(op).IsTagged());
+  return literal;
+}
+
+
+bool LCodeGen::IsInteger32(LConstantOperand* op) const {
+  return chunk_->LookupLiteralRepresentation(op).IsInteger32();
+}


 int LCodeGen::ToInteger32(LConstantOperand* op) const {
=======================================
--- /branches/bleeding_edge/src/mips/lithium-codegen-mips.h Thu Dec 1 06:32:26 2011 +++ /branches/bleeding_edge/src/mips/lithium-codegen-mips.h Thu Jan 5 01:26:15 2012
@@ -93,6 +93,9 @@
   // Returns a MemOperand pointing to the high word of a DoubleStackSlot.
   MemOperand ToHighMemOperand(LOperand* op) const;

+  bool IsInteger32(LConstantOperand* op) const;
+  Handle<Object> ToHandle(LConstantOperand* op) const;
+
   // Try to generate code for the entire chunk, but it may fail if the
   // chunk contains constructs we cannot handle. Returns true if the
   // code generation attempt succeeded.
=======================================
--- /branches/bleeding_edge/src/mips/lithium-gap-resolver-mips.cc Fri Oct 28 01:14:46 2011 +++ /branches/bleeding_edge/src/mips/lithium-gap-resolver-mips.cc Thu Jan 5 01:26:15 2012
@@ -252,14 +252,24 @@
     }

   } else if (source->IsConstantOperand()) {
-    Operand source_operand = cgen_->ToOperand(source);
+    LConstantOperand* constant_source = LConstantOperand::cast(source);
     if (destination->IsRegister()) {
-      __ li(cgen_->ToRegister(destination), source_operand);
+      Register dst = cgen_->ToRegister(destination);
+      if (cgen_->IsInteger32(constant_source)) {
+        __ li(dst, Operand(cgen_->ToInteger32(constant_source)));
+      } else {
+        __ LoadObject(dst, cgen_->ToHandle(constant_source));
+      }
     } else {
       ASSERT(destination->IsStackSlot());
ASSERT(!in_cycle_); // Constant moves happen after all cycles are gone.
-      MemOperand destination_operand = cgen_->ToMemOperand(destination);
-      __ li(kSavedValueRegister, source_operand);
+      if (cgen_->IsInteger32(constant_source)) {
+        __ li(kSavedValueRegister,
+              Operand(cgen_->ToInteger32(constant_source)));
+      } else {
+        __ LoadObject(kSavedValueRegister,
+                      cgen_->ToHandle(constant_source));
+      }
       __ sw(kSavedValueRegister, cgen_->ToMemOperand(destination));
     }

=======================================
--- /branches/bleeding_edge/src/mips/macro-assembler-mips.h Thu Dec 8 00:53:09 2011 +++ /branches/bleeding_edge/src/mips/macro-assembler-mips.h Thu Jan 5 01:26:15 2012
@@ -264,6 +264,14 @@

   void LoadHeapObject(Register dst, Handle<HeapObject> object);

+  void LoadObject(Register result, Handle<Object> object) {
+    if (object->IsHeapObject()) {
+      LoadHeapObject(result, Handle<HeapObject>::cast(object));
+    } else {
+      li(result, object);
+    }
+  }
+
// ---------------------------------------------------------------------------
   // GC Support

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

Reply via email to