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