Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index a4015b544c238bb4e3d6776b06d567d2cdcee409..092b9c1a623f8da6f0cb77ead6a2dbac7d3d14fa 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -291,7 +291,22 @@ Register LCodeGen::EmitLoadRegister(LOperand* op, Register scratch) { |
if (op->IsRegister()) { |
return ToRegister(op->index()); |
} else if (op->IsConstantOperand()) { |
- __ li(scratch, ToOperand(op)); |
+ LConstantOperand* const_op = LConstantOperand::cast(op); |
+ Handle<Object> literal = chunk_->LookupLiteral(const_op); |
+ Representation r = chunk_->LookupLiteralRepresentation(const_op); |
+ if (r.IsInteger32()) { |
+ ASSERT(literal->IsNumber()); |
+ __ li(scratch, Operand(static_cast<int32_t>(literal->Number()))); |
+ } else if (r.IsDouble()) { |
+ Abort("EmitLoadRegister: Unsupported double immediate."); |
+ } else { |
+ ASSERT(r.IsTagged()); |
+ if (literal->IsSmi()) { |
+ __ li(scratch, Operand(literal)); |
+ } else { |
+ __ LoadHeapObject(scratch, Handle<HeapObject>::cast(literal)); |
+ } |
+ } |
return scratch; |
} else if (op->IsStackSlot() || op->IsArgument()) { |
__ lw(scratch, ToMemOperand(op)); |
@@ -1162,8 +1177,13 @@ void LCodeGen::DoConstantD(LConstantD* instr) { |
void LCodeGen::DoConstantT(LConstantT* instr) { |
- ASSERT(instr->result()->IsRegister()); |
- __ li(ToRegister(instr->result()), Operand(instr->value())); |
+ Handle<Object> value = instr->value(); |
+ if (value->IsSmi()) { |
+ __ li(ToRegister(instr->result()), Operand(value)); |
+ } else { |
+ __ LoadHeapObject(ToRegister(instr->result()), |
+ Handle<HeapObject>::cast(value)); |
+ } |
} |
@@ -2039,7 +2059,7 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, |
// offset to the location of the map check. |
Register temp = ToRegister(instr->TempAt(0)); |
ASSERT(temp.is(t0)); |
- __ li(InstanceofStub::right(), Operand(instr->function())); |
+ __ LoadHeapObject(InstanceofStub::right(), instr->function()); |
static const int kAdditionalDelta = 7; |
int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; |
Label before_push_delta; |
@@ -2233,7 +2253,7 @@ void LCodeGen::EmitLoadFieldOrConstantFunction(Register result, |
} |
} else { |
Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*type)); |
- LoadHeapObject(result, Handle<HeapObject>::cast(function)); |
+ __ LoadHeapObject(result, function); |
} |
} |
@@ -2687,7 +2707,7 @@ void LCodeGen::DoPushArgument(LPushArgument* instr) { |
void LCodeGen::DoThisFunction(LThisFunction* instr) { |
Register result = ToRegister(instr->result()); |
- LoadHeapObject(result, instr->hydrogen()->closure()); |
+ __ LoadHeapObject(result, instr->hydrogen()->closure()); |
} |
@@ -2757,7 +2777,7 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function, |
void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { |
ASSERT(ToRegister(instr->result()).is(v0)); |
__ mov(a0, v0); |
- __ li(a1, Operand(instr->function())); |
+ __ LoadHeapObject(a1, instr->function()); |
CallKnownFunction(instr->function(), instr->arity(), instr, CALL_AS_METHOD); |
} |
@@ -3194,7 +3214,7 @@ void LCodeGen::DoCallGlobal(LCallGlobal* instr) { |
void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { |
ASSERT(ToRegister(instr->result()).is(v0)); |
- __ li(a1, Operand(instr->target())); |
+ __ LoadHeapObject(a1, instr->target()); |
CallKnownFunction(instr->target(), instr->arity(), instr, CALL_AS_FUNCTION); |
} |
@@ -4022,10 +4042,20 @@ void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { |
void LCodeGen::DoCheckFunction(LCheckFunction* instr) { |
- ASSERT(instr->InputAt(0)->IsRegister()); |
- Register reg = ToRegister(instr->InputAt(0)); |
- DeoptimizeIf(ne, instr->environment(), reg, |
- Operand(instr->hydrogen()->target())); |
+ Register reg = ToRegister(instr->value()); |
+ Handle<JSFunction> target = instr->hydrogen()->target(); |
+ if (isolate()->heap()->InNewSpace(*target)) { |
+ Register reg = ToRegister(instr->value()); |
+ Handle<JSGlobalPropertyCell> cell = |
+ isolate()->factory()->NewJSGlobalPropertyCell(target); |
+ __ li(at, Operand(Handle<Object>(cell))); |
+ __ lw(at, FieldMemOperand(at, JSGlobalPropertyCell::kValueOffset)); |
+ DeoptimizeIf(ne, instr->environment(), reg, |
+ Operand(at)); |
+ } else { |
+ DeoptimizeIf(ne, instr->environment(), reg, |
+ Operand(target)); |
+ } |
} |
@@ -4094,19 +4124,6 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) { |
} |
-void LCodeGen::LoadHeapObject(Register result, |
- Handle<HeapObject> object) { |
- if (heap()->InNewSpace(*object)) { |
- Handle<JSGlobalPropertyCell> cell = |
- factory()->NewJSGlobalPropertyCell(object); |
- __ li(result, Operand(cell)); |
- __ lw(result, FieldMemOperand(result, JSGlobalPropertyCell::kValueOffset)); |
- } else { |
- __ li(result, Operand(object)); |
- } |
-} |
- |
- |
void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { |
Register temp1 = ToRegister(instr->TempAt(0)); |
Register temp2 = ToRegister(instr->TempAt(1)); |
@@ -4115,7 +4132,7 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { |
Handle<JSObject> current_prototype = instr->prototype(); |
// Load prototype object. |
- LoadHeapObject(temp1, current_prototype); |
+ __ LoadHeapObject(temp1, current_prototype); |
// Check prototype maps up to the holder. |
while (!current_prototype.is_identical_to(holder)) { |
@@ -4127,7 +4144,7 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { |
current_prototype = |
Handle<JSObject>(JSObject::cast(current_prototype->GetPrototype())); |
// Load next prototype object. |
- LoadHeapObject(temp1, current_prototype); |
+ __ LoadHeapObject(temp1, current_prototype); |
} |
// Check the holder map. |
@@ -4148,7 +4165,7 @@ void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) { |
// than the expected one. The check isn't necessary if the boilerplate has |
// already been converted to FAST_ELEMENTS. |
if (boilerplate_elements_kind != FAST_ELEMENTS) { |
- LoadHeapObject(a1, instr->hydrogen()->boilerplate_object()); |
+ __ LoadHeapObject(a1, instr->hydrogen()->boilerplate_object()); |
// Load map into a2. |
__ lw(a2, FieldMemOperand(a1, HeapObject::kMapOffset)); |
// Load the map's "bit field 2". |
@@ -4223,10 +4240,10 @@ void LCodeGen::EmitDeepCopy(Handle<JSObject> object, |
Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
__ Addu(a2, result, Operand(*offset)); |
__ sw(a2, FieldMemOperand(result, total_offset)); |
- LoadHeapObject(source, value_object); |
+ __ LoadHeapObject(source, value_object); |
EmitDeepCopy(value_object, result, source, offset); |
} else if (value->IsHeapObject()) { |
- LoadHeapObject(a2, Handle<HeapObject>::cast(value)); |
+ __ LoadHeapObject(a2, Handle<HeapObject>::cast(value)); |
__ sw(a2, FieldMemOperand(result, total_offset)); |
} else { |
__ li(a2, Operand(value)); |
@@ -4252,7 +4269,7 @@ void LCodeGen::DoObjectLiteralFast(LObjectLiteralFast* instr) { |
__ bind(&allocated); |
int offset = 0; |
- LoadHeapObject(a1, instr->hydrogen()->boilerplate()); |
+ __ LoadHeapObject(a1, instr->hydrogen()->boilerplate()); |
EmitDeepCopy(instr->hydrogen()->boilerplate(), v0, a1, &offset); |
ASSERT_EQ(size, offset); |
} |