From 50f235fe495c6117f355781421875da2a1665c27 Mon Sep 17 00:00:00 2001 From: "vegorov@chromium.org" Date: Thu, 5 Jan 2012 09:26:15 +0000 Subject: [PATCH] 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 . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10335 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/lithium-codegen-mips.cc | 12 ++++++++++++ src/mips/lithium-codegen-mips.h | 3 +++ src/mips/lithium-gap-resolver-mips.cc | 18 ++++++++++++++---- src/mips/macro-assembler-mips.h | 8 ++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 53be7d1e17..06e886c6bb 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -353,6 +353,18 @@ DoubleRegister LCodeGen::EmitLoadDoubleRegister(LOperand* op, } +Handle LCodeGen::ToHandle(LConstantOperand* op) const { + Handle 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 { Handle value = chunk_->LookupLiteral(op); ASSERT(chunk_->LookupLiteralRepresentation(op).IsInteger32()); diff --git a/src/mips/lithium-codegen-mips.h b/src/mips/lithium-codegen-mips.h index 32d4fb3f4d..68a7c5b1aa 100644 --- a/src/mips/lithium-codegen-mips.h +++ b/src/mips/lithium-codegen-mips.h @@ -93,6 +93,9 @@ class LCodeGen BASE_EMBEDDED { // Returns a MemOperand pointing to the high word of a DoubleStackSlot. MemOperand ToHighMemOperand(LOperand* op) const; + bool IsInteger32(LConstantOperand* op) const; + Handle 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. diff --git a/src/mips/lithium-gap-resolver-mips.cc b/src/mips/lithium-gap-resolver-mips.cc index 8f7f89cf5d..2e5c64e7a2 100644 --- a/src/mips/lithium-gap-resolver-mips.cc +++ b/src/mips/lithium-gap-resolver-mips.cc @@ -252,14 +252,24 @@ void LGapResolver::EmitMove(int index) { } } 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)); } diff --git a/src/mips/macro-assembler-mips.h b/src/mips/macro-assembler-mips.h index 4e14fbf977..bd5b94f57c 100644 --- a/src/mips/macro-assembler-mips.h +++ b/src/mips/macro-assembler-mips.h @@ -264,6 +264,14 @@ class MacroAssembler: public Assembler { void LoadHeapObject(Register dst, Handle object); + void LoadObject(Register result, Handle object) { + if (object->IsHeapObject()) { + LoadHeapObject(result, Handle::cast(object)); + } else { + li(result, object); + } + } + // --------------------------------------------------------------------------- // GC Support