| 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);
|
| }
|
|
|