| Index: src/x64/lithium-x64.cc
|
| diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
|
| index 93a2eb7fcc3ff52c16d1fddddaabdb1e0b8be9e8..cd25b5f62396c7c3fc13e640b3a0392ed38e2f4c 100644
|
| --- a/src/x64/lithium-x64.cc
|
| +++ b/src/x64/lithium-x64.cc
|
| @@ -781,10 +781,11 @@ LInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
|
| HValue* right = instr->right();
|
| ASSERT(left->representation().IsTagged());
|
| ASSERT(right->representation().IsTagged());
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* left_operand = UseFixed(left, rdx);
|
| LOperand* right_operand = UseFixed(right, rax);
|
| LArithmeticT* result =
|
| - new(zone()) LArithmeticT(op, left_operand, right_operand);
|
| + new(zone()) LArithmeticT(op, context, left_operand, right_operand);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1061,7 +1062,8 @@ LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
|
| LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
|
| LOperand* left = UseFixed(instr->left(), rax);
|
| LOperand* right = UseFixed(instr->right(), rdx);
|
| - LInstanceOf* result = new(zone()) LInstanceOf(left, right);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LInstanceOf* result = new(zone()) LInstanceOf(context, left, right);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1069,7 +1071,8 @@ LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
|
| LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
|
| HInstanceOfKnownGlobal* instr) {
|
| LInstanceOfKnownGlobal* result =
|
| - new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->left(), rax),
|
| + new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->context(), rsi),
|
| + UseFixed(instr->left(), rax),
|
| FixedTemp(rdi));
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
| @@ -1127,14 +1130,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, rsi);
|
| }
|
|
|
| - return NULL;
|
| + return DefineAsRegister(new(zone()) LContext);
|
| }
|
|
|
|
|
| @@ -1145,12 +1147,14 @@ LInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
|
| - return MarkAsCall(new(zone()) LDeclareGlobals, instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) {
|
| - return DefineAsRegister(new(zone()) LGlobalObject);
|
| + LOperand* context = UseRegisterAtStart(instr->value());
|
| + return DefineAsRegister(new(zone()) LGlobalObject(context));
|
| }
|
|
|
|
|
| @@ -1167,8 +1171,9 @@ LInstruction* LChunkBuilder::DoCallConstantFunction(
|
|
|
|
|
| LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* function = UseFixed(instr->function(), rdi);
|
| - LInvokeFunction* result = new(zone()) LInvokeFunction(function);
|
| + LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
|
| return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
|
| }
|
|
|
| @@ -1207,8 +1212,9 @@ LInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
|
| + LOperand* context = UseAny(instr->context());
|
| LOperand* input = UseRegisterAtStart(instr->value());
|
| - LMathAbs* result = new(zone()) LMathAbs(input);
|
| + LMathAbs* result = new(zone()) LMathAbs(context, input);
|
| return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
|
| }
|
|
|
| @@ -1270,19 +1276,24 @@ LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
|
|
|
| LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) {
|
| ASSERT(instr->key()->representation().IsTagged());
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* key = UseFixed(instr->key(), rcx);
|
| - LCallKeyed* result = new(zone()) LCallKeyed(key);
|
| + LCallKeyed* result = new(zone()) LCallKeyed(context, key);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) {
|
| - return MarkAsCall(DefineFixed(new(zone()) LCallNamed, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LCallNamed* result = new(zone()) LCallNamed(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) {
|
| - return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LCallGlobal* result = new(zone()) LCallGlobal(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| @@ -1292,28 +1303,33 @@ LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* constructor = UseFixed(instr->constructor(), rdi);
|
| - LCallNew* result = new(zone()) LCallNew(constructor);
|
| + LCallNew* result = new(zone()) LCallNew(context, constructor);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* constructor = UseFixed(instr->constructor(), rdi);
|
| - LCallNewArray* result = new(zone()) LCallNewArray(constructor);
|
| + LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* function = UseFixed(instr->function(), rdi);
|
| - LCallFunction* result = new(zone()) LCallFunction(function);
|
| + LCallFunction* result = new(zone()) LCallFunction(context, function);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
|
| - return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LCallRuntime* result = new(zone()) LCallRuntime(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| @@ -1602,9 +1618,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(), rsi);
|
| LOperand* left = UseFixed(instr->left(), rdx);
|
| LOperand* right = UseFixed(instr->right(), rax);
|
| - LCmpT* result = new(zone()) LCmpT(left, right);
|
| + LCmpT* result = new(zone()) LCmpT(context, left, right);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1687,10 +1704,11 @@ LInstruction* LChunkBuilder::DoStringCompareAndBranch(
|
|
|
| ASSERT(instr->left()->representation().IsTagged());
|
| ASSERT(instr->right()->representation().IsTagged());
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* left = UseFixed(instr->left(), rdx);
|
| LOperand* right = UseFixed(instr->right(), rax);
|
| LStringCompareAndBranch* result =
|
| - new(zone()) LStringCompareAndBranch(left, right);
|
| + new(zone()) LStringCompareAndBranch(context, left, right);
|
|
|
| return MarkAsCall(result, instr);
|
| }
|
| @@ -1789,8 +1807,9 @@ LInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoThrow(HThrow* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* value = UseFixed(instr->value(), rax);
|
| - return MarkAsCall(new(zone()) LThrow(value), instr);
|
| + return MarkAsCall(new(zone()) LThrow(context, value), instr);
|
| }
|
|
|
|
|
| @@ -1966,9 +1985,10 @@ LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
|
| + LOperand* context = info()->IsStub() ? UseFixed(instr->context(), rsi) : NULL;
|
| LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
|
| - return new(zone()) LReturn(UseFixed(instr->value(), rax),
|
| - parameter_count);
|
| + return new(zone()) LReturn(
|
| + UseFixed(instr->value(), rax), context, parameter_count);
|
| }
|
|
|
|
|
| @@ -2001,8 +2021,10 @@ LInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* global_object = UseFixed(instr->global_object(), rax);
|
| - LLoadGlobalGeneric* result = new(zone()) LLoadGlobalGeneric(global_object);
|
| + LLoadGlobalGeneric* result =
|
| + new(zone()) LLoadGlobalGeneric(context, global_object);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -2018,10 +2040,11 @@ LInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* global_object = UseFixed(instr->global_object(), rdx);
|
| LOperand* value = UseFixed(instr->value(), rax);
|
| - LStoreGlobalGeneric* result = new(zone()) LStoreGlobalGeneric(global_object,
|
| - value);
|
| + LStoreGlobalGeneric* result =
|
| + new(zone()) LStoreGlobalGeneric(context, global_object, value);
|
| return MarkAsCall(result, instr);
|
| }
|
|
|
| @@ -2038,12 +2061,11 @@ LInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
|
| LOperand* context;
|
| LOperand* value;
|
| LOperand* temp;
|
| + context = UseRegister(instr->context());
|
| if (instr->NeedsWriteBarrier()) {
|
| - context = UseTempRegister(instr->context());
|
| value = UseTempRegister(instr->value());
|
| temp = TempRegister();
|
| } else {
|
| - context = UseRegister(instr->context());
|
| value = UseRegister(instr->value());
|
| temp = NULL;
|
| }
|
| @@ -2070,8 +2092,9 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* object = UseFixed(instr->object(), rax);
|
| - LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(object);
|
| + LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(context, object);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -2126,10 +2149,12 @@ LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* object = UseFixed(instr->object(), rdx);
|
| LOperand* key = UseFixed(instr->key(), rax);
|
|
|
| - LLoadKeyedGeneric* result = new(zone()) LLoadKeyedGeneric(object, key);
|
| + LLoadKeyedGeneric* result =
|
| + new(zone()) LLoadKeyedGeneric(context, object, key);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -2183,6 +2208,7 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* object = UseFixed(instr->object(), rdx);
|
| LOperand* key = UseFixed(instr->key(), rcx);
|
| LOperand* value = UseFixed(instr->value(), rax);
|
| @@ -2192,7 +2218,7 @@ LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
|
| ASSERT(instr->value()->representation().IsTagged());
|
|
|
| LStoreKeyedGeneric* result =
|
| - new(zone()) LStoreKeyedGeneric(object, key, value);
|
| + new(zone()) LStoreKeyedGeneric(context, object, key, value);
|
| return MarkAsCall(result, instr);
|
| }
|
|
|
| @@ -2204,12 +2230,13 @@ LInstruction* LChunkBuilder::DoTransitionElementsKind(
|
| LOperand* object = UseRegister(instr->object());
|
| LOperand* new_map_reg = TempRegister();
|
| LOperand* temp_reg = TempRegister();
|
| - LTransitionElementsKind* result =
|
| - new(zone()) LTransitionElementsKind(object, new_map_reg, temp_reg);
|
| + LTransitionElementsKind* result = new(zone()) LTransitionElementsKind(
|
| + object, NULL, new_map_reg, temp_reg);
|
| return result;
|
| } else {
|
| + LOperand* context = UseAny(instr->context());
|
| LTransitionElementsKind* result =
|
| - new(zone()) LTransitionElementsKind(object, NULL, NULL);
|
| + new(zone()) LTransitionElementsKind(object, context, NULL, NULL);
|
| return AssignPointerMap(result);
|
| }
|
| }
|
| @@ -2286,55 +2313,67 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* object = UseFixed(instr->object(), rdx);
|
| LOperand* value = UseFixed(instr->value(), rax);
|
|
|
| - LStoreNamedGeneric* result = new(zone()) LStoreNamedGeneric(object, value);
|
| + LStoreNamedGeneric* result =
|
| + new(zone()) LStoreNamedGeneric(context, object, value);
|
| return MarkAsCall(result, instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* left = UseOrConstantAtStart(instr->left());
|
| LOperand* right = UseOrConstantAtStart(instr->right());
|
| - return MarkAsCall(DefineFixed(new(zone()) LStringAdd(left, right), rax),
|
| - instr);
|
| + return MarkAsCall(
|
| + DefineFixed(new(zone()) LStringAdd(context, left, right), rax), 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* temp = TempRegister();
|
| - LAllocate* result = new(zone()) LAllocate(size, temp);
|
| + LAllocate* result = new(zone()) LAllocate(context, size, temp);
|
| return AssignPointerMap(DefineAsRegister(result));
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
|
| - return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LRegExpLiteral* result = new(zone()) LRegExpLiteral(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
|
| - return MarkAsCall(DefineFixed(new(zone()) LFunctionLiteral, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LFunctionLiteral* result = new(zone()) LFunctionLiteral(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| @@ -2381,7 +2420,9 @@ LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
|
| - return MarkAsCall(DefineFixed(new(zone()) LCallStub, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LCallStub* result = new(zone()) LCallStub(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| @@ -2426,7 +2467,9 @@ LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
|
| - LTypeof* result = new(zone()) LTypeof(UseAtStart(instr->value()));
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LOperand* value = UseAtStart(instr->value());
|
| + LTypeof* result = new(zone()) LTypeof(context, value);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -2466,10 +2509,13 @@ LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
|
| LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
|
| info()->MarkAsDeferredCalling();
|
| if (instr->is_function_entry()) {
|
| - return MarkAsCall(new(zone()) LStackCheck, instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + 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)));
|
| }
|
| }
|
|
|
| @@ -2514,8 +2560,9 @@ LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* object = UseFixed(instr->enumerable(), rax);
|
| - LForInPrepareMap* result = new(zone()) LForInPrepareMap(object);
|
| + LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
|
| return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY);
|
| }
|
|
|
|
|