Index: src/mips/lithium-mips.cc |
diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc |
index 8a349120eb6458dd51579896282dd99fbebcf9a1..12350ce345f4af698c4aad43167308879f00e4a5 100644 |
--- a/src/mips/lithium-mips.cc |
+++ b/src/mips/lithium-mips.cc |
@@ -785,10 +785,11 @@ LInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, |
HValue* right = instr->right(); |
ASSERT(left->representation().IsTagged()); |
ASSERT(right->representation().IsTagged()); |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* left_operand = UseFixed(left, a1); |
LOperand* right_operand = UseFixed(right, a0); |
LArithmeticT* result = |
- new(zone()) LArithmeticT(op, left_operand, right_operand); |
+ new(zone()) LArithmeticT(op, context, left_operand, right_operand); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
@@ -1045,8 +1046,9 @@ LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { |
LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LInstanceOf* result = |
- new(zone()) LInstanceOf(UseFixed(instr->left(), a0), |
+ new(zone()) LInstanceOf(context, UseFixed(instr->left(), a0), |
UseFixed(instr->right(), a1)); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
@@ -1055,8 +1057,10 @@ LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( |
HInstanceOfKnownGlobal* instr) { |
LInstanceOfKnownGlobal* result = |
- new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->left(), a0), |
- FixedTemp(t0)); |
+ new(zone()) LInstanceOfKnownGlobal( |
+ UseFixed(instr->context(), cp), |
+ UseFixed(instr->left(), a0), |
+ FixedTemp(t0)); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
@@ -1120,14 +1124,13 @@ LInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { |
LInstruction* LChunkBuilder::DoContext(HContext* instr) { |
- // If there is a non-return use, the context must be allocated in a register. |
- for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { |
- if (!it.value()->IsReturn()) { |
- return DefineAsRegister(new(zone()) LContext); |
- } |
+ if (instr->HasNoUses()) return NULL; |
+ |
+ if (info()->IsStub()) { |
+ return DefineFixed(new(zone()) LContext, cp); |
} |
- return NULL; |
+ return DefineAsRegister(new(zone()) LContext); |
} |
@@ -1138,7 +1141,8 @@ LInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) { |
LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { |
- return MarkAsCall(new(zone()) LDeclareGlobals, instr); |
+ LOperand* context = UseFixed(instr->context(), cp); |
+ return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); |
} |
@@ -1162,9 +1166,10 @@ LInstruction* LChunkBuilder::DoCallConstantFunction( |
LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* function = UseFixed(instr->function(), a1); |
argument_count_ -= instr->argument_count(); |
- LInvokeFunction* result = new(zone()) LInvokeFunction(function); |
+ LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); |
return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
} |
@@ -1238,8 +1243,12 @@ LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { |
LInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { |
+ Representation r = instr->value()->representation(); |
+ LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) |
+ ? NULL |
+ : UseFixed(instr->context(), cp); |
LOperand* input = UseRegister(instr->value()); |
- LMathAbs* result = new(zone()) LMathAbs(input); |
+ LMathAbs* result = new(zone()) LMathAbs(context, input); |
return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); |
} |
@@ -1269,21 +1278,25 @@ LInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { |
LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
ASSERT(instr->key()->representation().IsTagged()); |
+ LOperand* context = UseFixed(instr->context(), cp); |
argument_count_ -= instr->argument_count(); |
LOperand* key = UseFixed(instr->key(), a2); |
- return MarkAsCall(DefineFixed(new(zone()) LCallKeyed(key), v0), instr); |
+ return MarkAsCall( |
+ DefineFixed(new(zone()) LCallKeyed(context, key), v0), instr); |
} |
LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
argument_count_ -= instr->argument_count(); |
- return MarkAsCall(DefineFixed(new(zone()) LCallNamed, v0), instr); |
+ return MarkAsCall(DefineFixed(new(zone()) LCallNamed(context), v0), instr); |
} |
LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
argument_count_ -= instr->argument_count(); |
- return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, v0), instr); |
+ return MarkAsCall(DefineFixed(new(zone()) LCallGlobal(context), v0), instr); |
} |
@@ -1294,32 +1307,36 @@ LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { |
LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* constructor = UseFixed(instr->constructor(), a1); |
argument_count_ -= instr->argument_count(); |
- LCallNew* result = new(zone()) LCallNew(constructor); |
+ LCallNew* result = new(zone()) LCallNew(context, constructor); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* constructor = UseFixed(instr->constructor(), a1); |
argument_count_ -= instr->argument_count(); |
- LCallNewArray* result = new(zone()) LCallNewArray(constructor); |
+ LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* function = UseFixed(instr->function(), a1); |
argument_count_ -= instr->argument_count(); |
- return MarkAsCall(DefineFixed(new(zone()) LCallFunction(function), v0), |
- instr); |
+ return MarkAsCall( |
+ DefineFixed(new(zone()) LCallFunction(context, function), v0), instr); |
} |
LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { |
argument_count_ -= instr->argument_count(); |
- return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, v0), instr); |
+ LOperand* context = UseFixed(instr->context(), cp); |
+ return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr); |
} |
@@ -1640,9 +1657,10 @@ LInstruction* LChunkBuilder::DoRandom(HRandom* instr) { |
LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { |
ASSERT(instr->left()->representation().IsTagged()); |
ASSERT(instr->right()->representation().IsTagged()); |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* left = UseFixed(instr->left(), a1); |
LOperand* right = UseFixed(instr->right(), a0); |
- LCmpT* result = new(zone()) LCmpT(left, right); |
+ LCmpT* result = new(zone()) LCmpT(context, left, right); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
@@ -1716,10 +1734,11 @@ LInstruction* LChunkBuilder::DoStringCompareAndBranch( |
HStringCompareAndBranch* instr) { |
ASSERT(instr->left()->representation().IsTagged()); |
ASSERT(instr->right()->representation().IsTagged()); |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* left = UseFixed(instr->left(), a1); |
LOperand* right = UseFixed(instr->right(), a0); |
LStringCompareAndBranch* result = |
- new(zone()) LStringCompareAndBranch(left, right); |
+ new(zone()) LStringCompareAndBranch(context, left, right); |
return MarkAsCall(result, instr); |
} |
@@ -1814,8 +1833,9 @@ LInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { |
LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* value = UseFixed(instr->value(), a0); |
- return MarkAsCall(new(zone()) LThrow(value), instr); |
+ return MarkAsCall(new(zone()) LThrow(context, value), instr); |
} |
@@ -1996,8 +2016,11 @@ LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { |
LInstruction* LChunkBuilder::DoReturn(HReturn* instr) { |
+ LOperand* context = info()->IsStub() |
+ ? UseFixed(instr->context(), cp) |
+ : NULL; |
LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); |
- return new(zone()) LReturn(UseFixed(instr->value(), v0), |
+ return new(zone()) LReturn(UseFixed(instr->value(), v0), context, |
parameter_count); |
} |
@@ -2030,8 +2053,10 @@ LInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { |
LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* global_object = UseFixed(instr->global_object(), a0); |
- LLoadGlobalGeneric* result = new(zone()) LLoadGlobalGeneric(global_object); |
+ LLoadGlobalGeneric* result = |
+ new(zone()) LLoadGlobalGeneric(context, global_object); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
@@ -2047,10 +2072,11 @@ LInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { |
LInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* global_object = UseFixed(instr->global_object(), a1); |
LOperand* value = UseFixed(instr->value(), a0); |
LStoreGlobalGeneric* result = |
- new(zone()) LStoreGlobalGeneric(global_object, value); |
+ new(zone()) LStoreGlobalGeneric(context, global_object, value); |
return MarkAsCall(result, instr); |
} |
@@ -2085,8 +2111,10 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { |
LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* object = UseFixed(instr->object(), a0); |
- LInstruction* result = DefineFixed(new(zone()) LLoadNamedGeneric(object), v0); |
+ LInstruction* result = |
+ DefineFixed(new(zone()) LLoadNamedGeneric(context, object), v0); |
return MarkAsCall(result, instr); |
} |
@@ -2147,11 +2175,12 @@ LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { |
LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* object = UseFixed(instr->object(), a1); |
LOperand* key = UseFixed(instr->key(), a0); |
LInstruction* result = |
- DefineFixed(new(zone()) LLoadKeyedGeneric(object, key), v0); |
+ DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key), v0); |
return MarkAsCall(result, instr); |
} |
@@ -2201,6 +2230,7 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { |
LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* obj = UseFixed(instr->object(), a2); |
LOperand* key = UseFixed(instr->key(), a1); |
LOperand* val = UseFixed(instr->value(), a0); |
@@ -2209,7 +2239,8 @@ LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { |
ASSERT(instr->key()->representation().IsTagged()); |
ASSERT(instr->value()->representation().IsTagged()); |
- return MarkAsCall(new(zone()) LStoreKeyedGeneric(obj, key, val), instr); |
+ return MarkAsCall( |
+ new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr); |
} |
@@ -2219,11 +2250,12 @@ LInstruction* LChunkBuilder::DoTransitionElementsKind( |
if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { |
LOperand* new_map_reg = TempRegister(); |
LTransitionElementsKind* result = |
- new(zone()) LTransitionElementsKind(object, new_map_reg); |
+ new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); |
return result; |
} else { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LTransitionElementsKind* result = |
- new(zone()) LTransitionElementsKind(object, NULL); |
+ new(zone()) LTransitionElementsKind(object, context, NULL); |
return AssignPointerMap(result); |
} |
} |
@@ -2282,56 +2314,68 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
LInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* obj = UseFixed(instr->object(), a1); |
LOperand* val = UseFixed(instr->value(), a0); |
- LInstruction* result = new(zone()) LStoreNamedGeneric(obj, val); |
+ LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val); |
return MarkAsCall(result, instr); |
} |
LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* left = UseRegisterAtStart(instr->left()); |
LOperand* right = UseRegisterAtStart(instr->right()); |
- return MarkAsCall(DefineFixed(new(zone()) LStringAdd(left, right), v0), |
- instr); |
+ return MarkAsCall( |
+ DefineFixed(new(zone()) LStringAdd(context, left, right), v0), |
+ instr); |
} |
LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { |
LOperand* string = UseTempRegister(instr->string()); |
LOperand* index = UseTempRegister(instr->index()); |
- LStringCharCodeAt* result = new(zone()) LStringCharCodeAt(string, index); |
+ LOperand* context = UseAny(instr->context()); |
+ LStringCharCodeAt* result = |
+ new(zone()) LStringCharCodeAt(context, string, index); |
return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); |
} |
LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { |
LOperand* char_code = UseRegister(instr->value()); |
- LStringCharFromCode* result = new(zone()) LStringCharFromCode(char_code); |
+ LOperand* context = UseAny(instr->context()); |
+ LStringCharFromCode* result = |
+ new(zone()) LStringCharFromCode(context, char_code); |
return AssignPointerMap(DefineAsRegister(result)); |
} |
LInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { |
info()->MarkAsDeferredCalling(); |
+ LOperand* context = UseAny(instr->context()); |
LOperand* size = instr->size()->IsConstant() |
? UseConstant(instr->size()) |
: UseTempRegister(instr->size()); |
LOperand* temp1 = TempRegister(); |
LOperand* temp2 = TempRegister(); |
- LAllocate* result = new(zone()) LAllocate(size, temp1, temp2); |
+ LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); |
return AssignPointerMap(DefineAsRegister(result)); |
} |
LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { |
- return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, v0), instr); |
+ LOperand* context = UseFixed(instr->context(), cp); |
+ return MarkAsCall( |
+ DefineFixed(new(zone()) LRegExpLiteral(context), v0), instr); |
} |
LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { |
- return MarkAsCall(DefineFixed(new(zone()) LFunctionLiteral, v0), instr); |
+ LOperand* context = UseFixed(instr->context(), cp); |
+ return MarkAsCall( |
+ DefineFixed(new(zone()) LFunctionLiteral(context), v0), instr); |
} |
@@ -2378,8 +2422,9 @@ LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { |
LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
argument_count_ -= instr->argument_count(); |
- return MarkAsCall(DefineFixed(new(zone()) LCallStub, v0), instr); |
+ return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), v0), instr); |
} |
@@ -2424,7 +2469,8 @@ LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { |
LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { |
- LTypeof* result = new(zone()) LTypeof(UseFixed(instr->value(), a0)); |
+ LOperand* context = UseFixed(instr->context(), cp); |
+ LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0)); |
return MarkAsCall(DefineFixed(result, v0), instr); |
} |
@@ -2463,10 +2509,13 @@ LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { |
LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { |
if (instr->is_function_entry()) { |
- return MarkAsCall(new(zone()) LStackCheck, instr); |
+ LOperand* context = UseFixed(instr->context(), cp); |
+ return MarkAsCall(new(zone()) LStackCheck(context), instr); |
} else { |
ASSERT(instr->is_backwards_branch()); |
- return AssignEnvironment(AssignPointerMap(new(zone()) LStackCheck)); |
+ LOperand* context = UseAny(instr->context()); |
+ return AssignEnvironment( |
+ AssignPointerMap(new(zone()) LStackCheck(context))); |
} |
} |
@@ -2511,8 +2560,9 @@ LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { |
LInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { |
+ LOperand* context = UseFixed(instr->context(), cp); |
LOperand* object = UseFixed(instr->enumerable(), a0); |
- LForInPrepareMap* result = new(zone()) LForInPrepareMap(object); |
+ LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); |
return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); |
} |