| Index: src/x64/lithium-x64.cc
|
| diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
|
| index bd319560cb9870616e4b9d3e94e5c85ecbd7a45e..bb7ada8716923dc88b7a7c75bd6d4e27ab9332e4 100644
|
| --- a/src/x64/lithium-x64.cc
|
| +++ b/src/x64/lithium-x64.cc
|
| @@ -819,9 +819,10 @@ LInstruction* LChunkBuilder::DoBit(Token::Value op,
|
| 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);
|
| - LArithmeticT* result = new LArithmeticT(op, left, right);
|
| + LArithmeticT* result = new LArithmeticT(op, context, left, right);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
| }
|
| @@ -833,9 +834,10 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op,
|
| 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);
|
| - LArithmeticT* result = new LArithmeticT(op, left, right);
|
| + LArithmeticT* result = new LArithmeticT(op, context, left, right);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -898,9 +900,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 LArithmeticT(op, left_operand, right_operand);
|
| + LArithmeticT* result =
|
| + new LArithmeticT(op, context, left_operand, right_operand);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1060,16 +1064,19 @@ 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 LInstanceOf(left, right);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LInstanceOf* result = new LInstanceOf(context, left, right);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
|
| HInstanceOfKnownGlobal* instr) {
|
| + LOperand* left = UseFixed(instr->left(), rax);
|
| + LOperand* temp = FixedTemp(rdi);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LInstanceOfKnownGlobal* result =
|
| - new LInstanceOfKnownGlobal(UseFixed(instr->left(), rax),
|
| - FixedTemp(rdi));
|
| + new LInstanceOfKnownGlobal(context, left, temp);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1111,7 +1118,8 @@ LInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) {
|
| - return DefineAsRegister(new LGlobalObject);
|
| + LOperand* context = UseRegisterAtStart(instr->value());
|
| + return DefineAsRegister(new LGlobalObject(context));
|
| }
|
|
|
|
|
| @@ -1129,22 +1137,32 @@ LInstruction* LChunkBuilder::DoCallConstantFunction(
|
|
|
|
|
| LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* function = UseFixed(instr->function(), rdi);
|
| argument_count_ -= instr->argument_count();
|
| - LInvokeFunction* result = new LInvokeFunction(function);
|
| + LInvokeFunction* result = new LInvokeFunction(context, function);
|
| return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
|
| BuiltinFunctionId op = instr->op();
|
| - if (op == kMathLog || op == kMathSin || op == kMathCos) {
|
| + if (op == kMathLog) {
|
| + ASSERT(instr->representation().IsDouble());
|
| + ASSERT(instr->value()->representation().IsDouble());
|
| + LOperand* context = UseAny(instr->context()); // Not actually used.
|
| + LOperand* input = UseRegisterAtStart(instr->value());
|
| + LUnaryMathOperation* result = new LUnaryMathOperation(context, input);
|
| + return DefineSameAsFirst(result);
|
| + } else if (op == kMathSin || op == kMathCos) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* input = UseFixedDouble(instr->value(), xmm1);
|
| - LUnaryMathOperation* result = new LUnaryMathOperation(input);
|
| + LUnaryMathOperation* result = new LUnaryMathOperation(context, input);
|
| return MarkAsCall(DefineFixedDouble(result, xmm1), instr);
|
| } else {
|
| LOperand* input = UseRegisterAtStart(instr->value());
|
| - LUnaryMathOperation* result = new LUnaryMathOperation(input);
|
| + LOperand* context = UseAny(instr->context()); // Deferred use by MathAbs.
|
| + LUnaryMathOperation* result = new LUnaryMathOperation(context, input);
|
| switch (op) {
|
| case kMathAbs:
|
| return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
|
| @@ -1167,21 +1185,26 @@ LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
|
| LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) {
|
| ASSERT(instr->key()->representation().IsTagged());
|
| LOperand* key = UseFixed(instr->key(), rcx);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| argument_count_ -= instr->argument_count();
|
| - LCallKeyed* result = new LCallKeyed(key);
|
| + LCallKeyed* result = new LCallKeyed(context, key);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| argument_count_ -= instr->argument_count();
|
| - return MarkAsCall(DefineFixed(new LCallNamed, rax), instr);
|
| + LCallNamed* result = new LCallNamed(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| argument_count_ -= instr->argument_count();
|
| - return MarkAsCall(DefineFixed(new LCallGlobal, rax), instr);
|
| + LCallGlobal* result = new LCallGlobal(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| @@ -1192,23 +1215,27 @@ LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* constructor = UseFixed(instr->constructor(), rdi);
|
| argument_count_ -= instr->argument_count();
|
| - LCallNew* result = new LCallNew(constructor);
|
| + LCallNew* result = new LCallNew(context, constructor);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| argument_count_ -= instr->argument_count();
|
| - LCallFunction* result = new LCallFunction();
|
| + LCallFunction* result = new LCallFunction(context);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| argument_count_ -= instr->argument_count();
|
| - return MarkAsCall(DefineFixed(new LCallRuntime, rax), instr);
|
| + LCallRuntime* result = new LCallRuntime(context);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| @@ -1394,9 +1421,10 @@ LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
|
| ASSERT(instr->left()->representation().IsTagged());
|
| ASSERT(instr->right()->representation().IsTagged());
|
| bool reversed = (op == Token::GT || op == Token::LTE);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* left = UseFixed(instr->left(), reversed ? rax : rdx);
|
| LOperand* right = UseFixed(instr->right(), reversed ? rdx : rax);
|
| - LCmpT* result = new LCmpT(left, right);
|
| + LCmpT* result = new LCmpT(context, left, right);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1533,8 +1561,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 LThrow(value), instr);
|
| + return MarkAsCall(new LThrow(context, value), instr);
|
| }
|
|
|
|
|
| @@ -1722,8 +1751,9 @@ 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 LLoadGlobalGeneric(global_object);
|
| + LLoadGlobalGeneric* result = new LLoadGlobalGeneric(context, global_object);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1736,9 +1766,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 LStoreGlobalGeneric(global_object, value);
|
| + LStoreGlobalGeneric* result =
|
| + new LStoreGlobalGeneric(context, global_object, value);
|
| return MarkAsCall(result, instr);
|
| }
|
|
|
| @@ -1776,21 +1808,25 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
|
| LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
|
| HLoadNamedFieldPolymorphic* instr) {
|
| ASSERT(instr->representation().IsTagged());
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| if (instr->need_generic()) {
|
| LOperand* obj = UseFixed(instr->object(), rax);
|
| - LLoadNamedFieldPolymorphic* result = new LLoadNamedFieldPolymorphic(obj);
|
| + LLoadNamedFieldPolymorphic* result =
|
| + new LLoadNamedFieldPolymorphic(context, obj);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| } else {
|
| LOperand* obj = UseRegisterAtStart(instr->object());
|
| - LLoadNamedFieldPolymorphic* result = new LLoadNamedFieldPolymorphic(obj);
|
| + LLoadNamedFieldPolymorphic* result =
|
| + new LLoadNamedFieldPolymorphic(context, obj);
|
| return AssignEnvironment(DefineAsRegister(result));
|
| }
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* object = UseFixed(instr->object(), rax);
|
| - LLoadNamedGeneric* result = new LLoadNamedGeneric(object);
|
| + LLoadNamedGeneric* result = new LLoadNamedGeneric(context, object);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1863,10 +1899,11 @@ LInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
|
|
|
|
|
| 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 LLoadKeyedGeneric(object, key);
|
| + LLoadKeyedGeneric* result = new LLoadKeyedGeneric(context, object, key);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -1934,6 +1971,7 @@ LInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
|
|
|
|
|
| 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);
|
| @@ -1942,7 +1980,8 @@ LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
|
| ASSERT(instr->key()->representation().IsTagged());
|
| ASSERT(instr->value()->representation().IsTagged());
|
|
|
| - LStoreKeyedGeneric* result = new LStoreKeyedGeneric(object, key, value);
|
| + LStoreKeyedGeneric* result =
|
| + new LStoreKeyedGeneric(context, object, key, value);
|
| return MarkAsCall(result, instr);
|
| }
|
|
|
| @@ -1968,32 +2007,37 @@ 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 LStoreNamedGeneric(object, value);
|
| + LStoreNamedGeneric* result = new 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 LStringAdd(left, right), rax), instr);
|
| + LStringAdd* result = new LStringAdd(context, left, right);
|
| + return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
|
| LOperand* string = UseTempRegister(instr->string());
|
| LOperand* index = UseTempRegister(instr->index());
|
| - LStringCharCodeAt* result = new LStringCharCodeAt(string, index);
|
| + LOperand* context = UseAny(instr->context());
|
| + LStringCharCodeAt* result = new LStringCharCodeAt(context, string, index);
|
| return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
|
| LOperand* char_code = UseRegister(instr->value());
|
| - LStringCharFromCode* result = new LStringCharFromCode(char_code);
|
| + LOperand* context = UseAny(instr->context());
|
| + LStringCharFromCode* result = new LStringCharFromCode(context, char_code);
|
| return AssignPointerMap(DefineAsRegister(result));
|
| }
|
|
|
| @@ -2005,29 +2049,34 @@ LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) {
|
| - return MarkAsCall(DefineFixed(new LArrayLiteral, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + return MarkAsCall(DefineFixed(new LArrayLiteral(context), rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) {
|
| - return MarkAsCall(DefineFixed(new LObjectLiteral, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + return MarkAsCall(DefineFixed(new LObjectLiteral(context), rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
|
| - return MarkAsCall(DefineFixed(new LRegExpLiteral, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + return MarkAsCall(DefineFixed(new LRegExpLiteral(context), rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
|
| - return MarkAsCall(DefineFixed(new LFunctionLiteral, rax), instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + return MarkAsCall(DefineFixed(new LFunctionLiteral(context), rax), instr);
|
| }
|
|
|
|
|
| LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
|
| - LDeleteProperty* result =
|
| - new LDeleteProperty(UseAtStart(instr->object()),
|
| - UseOrConstantAtStart(instr->key()));
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LOperand* object = UseAtStart(instr->object());
|
| + LOperand* key = UseOrConstantAtStart(instr->key());
|
| + LDeleteProperty* result = new LDeleteProperty(context, object, key);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -2056,8 +2105,9 @@ LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| argument_count_ -= instr->argument_count();
|
| - return MarkAsCall(DefineFixed(new LCallStub, rax), instr);
|
| + return MarkAsCall(DefineFixed(new LCallStub(context), rax), instr);
|
| }
|
|
|
|
|
| @@ -2087,7 +2137,9 @@ LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
|
| - LTypeof* result = new LTypeof(UseAtStart(instr->value()));
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + LOperand* value = UseAtStart(instr->value());
|
| + LTypeof* result = new LTypeof(context, value);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
| @@ -2136,10 +2188,12 @@ LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
|
|
|
| LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
|
| if (instr->is_function_entry()) {
|
| - return MarkAsCall(new LStackCheck, instr);
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| + return MarkAsCall(new LStackCheck(context), instr);
|
| } else {
|
| ASSERT(instr->is_backwards_branch());
|
| - return AssignEnvironment(AssignPointerMap(new LStackCheck));
|
| + LOperand* context = UseAny(instr->context());
|
| + return AssignEnvironment(AssignPointerMap(new LStackCheck(context)));
|
| }
|
| }
|
|
|
| @@ -2165,9 +2219,10 @@ LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoIn(HIn* instr) {
|
| + LOperand* context = UseFixed(instr->context(), rsi);
|
| LOperand* key = UseOrConstantAtStart(instr->key());
|
| LOperand* object = UseOrConstantAtStart(instr->object());
|
| - LIn* result = new LIn(key, object);
|
| + LIn* result = new LIn(context, key, object);
|
| return MarkAsCall(DefineFixed(result, rax), instr);
|
| }
|
|
|
|
|