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 <kalmard@homejinni.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10335 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
07eb3ada9d
commit
50f235fe49
@ -353,6 +353,18 @@ DoubleRegister LCodeGen::EmitLoadDoubleRegister(LOperand* op,
|
||||
}
|
||||
|
||||
|
||||
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 {
|
||||
Handle<Object> value = chunk_->LookupLiteral(op);
|
||||
ASSERT(chunk_->LookupLiteralRepresentation(op).IsInteger32());
|
||||
|
@ -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<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.
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -264,6 +264,14 @@ class MacroAssembler: public Assembler {
|
||||
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user