| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 080b2a0a7a69ddade6126e6e8a4c8225b0bc5b43..ec1adb97db48302cf01b836872b899b6f5782e6d 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -428,15 +428,11 @@ void LCodeGen::AddToTranslation(Translation* translation,
|
| void LCodeGen::CallCodeGeneric(Handle<Code> code,
|
| RelocInfo::Mode mode,
|
| LInstruction* instr,
|
| - ContextMode context_mode,
|
| SafepointMode safepoint_mode) {
|
| ASSERT(instr != NULL);
|
| LPointerMap* pointers = instr->pointer_map();
|
| RecordPosition(pointers->position());
|
|
|
| - if (context_mode == RESTORE_CONTEXT) {
|
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| - }
|
| __ call(code, mode);
|
|
|
| RegisterLazyDeoptimization(instr, safepoint_mode);
|
| @@ -452,24 +448,19 @@ void LCodeGen::CallCodeGeneric(Handle<Code> code,
|
|
|
| void LCodeGen::CallCode(Handle<Code> code,
|
| RelocInfo::Mode mode,
|
| - LInstruction* instr,
|
| - ContextMode context_mode) {
|
| - CallCodeGeneric(code, mode, instr, context_mode, RECORD_SIMPLE_SAFEPOINT);
|
| + LInstruction* instr) {
|
| + CallCodeGeneric(code, mode, instr, RECORD_SIMPLE_SAFEPOINT);
|
| }
|
|
|
|
|
| void LCodeGen::CallRuntime(const Runtime::Function* fun,
|
| int argc,
|
| - LInstruction* instr,
|
| - ContextMode context_mode) {
|
| + LInstruction* instr) {
|
| ASSERT(instr != NULL);
|
| ASSERT(instr->HasPointerMap());
|
| LPointerMap* pointers = instr->pointer_map();
|
| RecordPosition(pointers->position());
|
|
|
| - if (context_mode == RESTORE_CONTEXT) {
|
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| - }
|
| __ CallRuntime(fun, argc);
|
|
|
| RegisterLazyDeoptimization(instr, RECORD_SIMPLE_SAFEPOINT);
|
| @@ -478,8 +469,18 @@ void LCodeGen::CallRuntime(const Runtime::Function* fun,
|
|
|
| void LCodeGen::CallRuntimeFromDeferred(Runtime::FunctionId id,
|
| int argc,
|
| - LInstruction* instr) {
|
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| + LInstruction* instr,
|
| + LOperand* context) {
|
| + ASSERT(context->IsRegister() || context->IsStackSlot());
|
| + if (context->IsRegister()) {
|
| + if (!ToRegister(context).is(esi)) {
|
| + __ mov(esi, ToRegister(context));
|
| + }
|
| + } else {
|
| + // Context is stack slot.
|
| + __ mov(esi, ToOperand(context));
|
| + }
|
| +
|
| __ CallRuntimeSaveDoubles(id);
|
| RecordSafepointWithRegisters(
|
| instr->pointer_map(), argc, Safepoint::kNoDeoptimizationIndex);
|
| @@ -748,38 +749,38 @@ void LCodeGen::DoCallStub(LCallStub* instr) {
|
| switch (instr->hydrogen()->major_key()) {
|
| case CodeStub::RegExpConstructResult: {
|
| RegExpConstructResultStub stub;
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| case CodeStub::RegExpExec: {
|
| RegExpExecStub stub;
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| case CodeStub::SubString: {
|
| SubStringStub stub;
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| case CodeStub::NumberToString: {
|
| NumberToStringStub stub;
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| case CodeStub::StringAdd: {
|
| StringAddStub stub(NO_STRING_ADD_FLAGS);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| case CodeStub::StringCompare: {
|
| StringCompareStub stub;
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| case CodeStub::TranscendentalCache: {
|
| TranscendentalCacheStub stub(instr->transcendental_type(),
|
| TranscendentalCacheStub::TAGGED);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| default:
|
| @@ -1256,8 +1257,9 @@ void LCodeGen::DoBitNotI(LBitNotI* instr) {
|
|
|
|
|
| void LCodeGen::DoThrow(LThrow* instr) {
|
| - __ push(ToOperand(instr->InputAt(0)));
|
| - CallRuntime(Runtime::kThrow, 1, instr, RESTORE_CONTEXT);
|
| + __ push(ToOperand(instr->value()));
|
| + ASSERT(ToRegister(instr->context()).is(esi));
|
| + CallRuntime(Runtime::kThrow, 1, instr);
|
|
|
| if (FLAG_debug_code) {
|
| Comment("Unreachable code.");
|
| @@ -1327,12 +1329,13 @@ void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
|
|
|
|
| void LCodeGen::DoArithmeticT(LArithmeticT* instr) {
|
| - ASSERT(ToRegister(instr->InputAt(0)).is(edx));
|
| - ASSERT(ToRegister(instr->InputAt(1)).is(eax));
|
| + ASSERT(ToRegister(instr->context()).is(esi));
|
| + ASSERT(ToRegister(instr->left()).is(edx));
|
| + ASSERT(ToRegister(instr->right()).is(eax));
|
| ASSERT(ToRegister(instr->result()).is(eax));
|
|
|
| BinaryOpStub stub(instr->op(), NO_OVERWRITE);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -1767,7 +1770,7 @@ void LCodeGen::DoInstanceOf(LInstanceOf* instr) {
|
| // Object and function are in fixed registers defined by the stub.
|
| ASSERT(ToRegister(instr->context()).is(esi));
|
| InstanceofStub stub(InstanceofStub::kArgsInRegisters);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
|
|
| Label true_value, done;
|
| __ test(eax, Operand(eax));
|
| @@ -1801,7 +1804,7 @@ void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
|
| deferred = new DeferredInstanceOfKnownGlobal(this, instr);
|
|
|
| Label done, false_result;
|
| - Register object = ToRegister(instr->InputAt(0));
|
| + Register object = ToRegister(instr->InputAt(1));
|
| Register temp = ToRegister(instr->TempAt(0));
|
|
|
| // A Smi is not an instance of anything.
|
| @@ -1863,14 +1866,13 @@ void LCodeGen::DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
| Register temp = ToRegister(instr->TempAt(0));
|
| ASSERT(MacroAssembler::SafepointRegisterStackIndex(temp) == 0);
|
| __ mov(InstanceofStub::right(), Immediate(instr->function()));
|
| - static const int kAdditionalDelta = 16;
|
| + static const int kAdditionalDelta = 13;
|
| int delta = masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta;
|
| __ mov(temp, Immediate(delta));
|
| __ StoreToSafepointRegisterSlot(temp, temp);
|
| CallCodeGeneric(stub.GetCode(),
|
| RelocInfo::CODE_TARGET,
|
| instr,
|
| - RESTORE_CONTEXT,
|
| RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
|
| // Put the result value into the eax slot and restore all registers.
|
| __ StoreToSafepointRegisterSlot(eax, eax);
|
| @@ -1901,7 +1903,7 @@ void LCodeGen::DoCmpT(LCmpT* instr) {
|
| Token::Value op = instr->op();
|
|
|
| Handle<Code> ic = CompareIC::GetUninitialized(op);
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
|
|
| Condition condition = ComputeCompareCondition(op);
|
| if (op == Token::GT || op == Token::LTE) {
|
| @@ -1953,7 +1955,7 @@ void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) {
|
| RelocInfo::Mode mode = instr->for_typeof() ? RelocInfo::CODE_TARGET :
|
| RelocInfo::CODE_TARGET_CONTEXT;
|
| Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallCode(ic, mode, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, mode, instr);
|
| }
|
|
|
|
|
| @@ -1984,7 +1986,7 @@ void LCodeGen::DoStoreGlobalGeneric(LStoreGlobalGeneric* instr) {
|
| Handle<Code> ic = instr->strict_mode()
|
| ? isolate()->builtins()->StoreIC_Initialize_Strict()
|
| : isolate()->builtins()->StoreIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET_CONTEXT, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, RelocInfo::CODE_TARGET_CONTEXT, instr);
|
| }
|
|
|
|
|
| @@ -2056,7 +2058,7 @@ void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) {
|
| ASSERT(instr->hydrogen()->need_generic());
|
| __ mov(ecx, name);
|
| Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| } else {
|
| Label done;
|
| for (int i = 0; i < map_count - 1; ++i) {
|
| @@ -2078,7 +2080,7 @@ void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) {
|
| __ bind(&generic);
|
| __ mov(ecx, name);
|
| Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| } else {
|
| DeoptimizeIf(not_equal, instr->environment());
|
| EmitLoadFieldOrConstantFunction(result, object, map, name);
|
| @@ -2095,7 +2097,7 @@ void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
|
|
|
| __ mov(ecx, instr->name());
|
| Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -2294,7 +2296,7 @@ void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) {
|
| ASSERT(ToRegister(instr->key()).is(eax));
|
|
|
| Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -2524,7 +2526,7 @@ void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) {
|
|
|
|
|
| void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr) {
|
| - Register input_reg = ToRegister(instr->InputAt(0));
|
| + Register input_reg = ToRegister(instr->value());
|
| __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset),
|
| factory()->heap_number_map());
|
| DeoptimizeIf(not_equal, instr->environment());
|
| @@ -2555,7 +2557,8 @@ void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr) {
|
| // Slow case: Call the runtime system to do the number allocation.
|
| __ bind(&slow);
|
|
|
| - CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr);
|
| + CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0,
|
| + instr, instr->context());
|
|
|
| // Set the pointer to the new heap number in tmp.
|
| if (!tmp.is(eax)) __ mov(tmp, eax);
|
| @@ -2576,7 +2579,7 @@ void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr) {
|
|
|
|
|
| void LCodeGen::EmitIntegerMathAbs(LUnaryMathOperation* instr) {
|
| - Register input_reg = ToRegister(instr->InputAt(0));
|
| + Register input_reg = ToRegister(instr->value());
|
| __ test(input_reg, Operand(input_reg));
|
| Label is_positive;
|
| __ j(not_sign, &is_positive);
|
| @@ -2601,12 +2604,12 @@ void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
|
| LUnaryMathOperation* instr_;
|
| };
|
|
|
| - ASSERT(instr->InputAt(0)->Equals(instr->result()));
|
| + ASSERT(instr->value()->Equals(instr->result()));
|
| Representation r = instr->hydrogen()->value()->representation();
|
|
|
| if (r.IsDouble()) {
|
| XMMRegister scratch = xmm0;
|
| - XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
| + XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| __ xorps(scratch, scratch);
|
| __ subsd(scratch, input_reg);
|
| __ pand(input_reg, scratch);
|
| @@ -2615,7 +2618,7 @@ void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
|
| } else { // Tagged case.
|
| DeferredMathAbsTaggedHeapNumber* deferred =
|
| new DeferredMathAbsTaggedHeapNumber(this, instr);
|
| - Register input_reg = ToRegister(instr->InputAt(0));
|
| + Register input_reg = ToRegister(instr->value());
|
| // Smi check.
|
| __ JumpIfNotSmi(input_reg, deferred->entry());
|
| EmitIntegerMathAbs(instr);
|
| @@ -2627,7 +2630,7 @@ void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
|
| void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) {
|
| XMMRegister xmm_scratch = xmm0;
|
| Register output_reg = ToRegister(instr->result());
|
| - XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
| + XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| __ xorps(xmm_scratch, xmm_scratch); // Zero the register.
|
| __ ucomisd(input_reg, xmm_scratch);
|
|
|
| @@ -2649,7 +2652,7 @@ void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) {
|
| void LCodeGen::DoMathRound(LUnaryMathOperation* instr) {
|
| XMMRegister xmm_scratch = xmm0;
|
| Register output_reg = ToRegister(instr->result());
|
| - XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
| + XMMRegister input_reg = ToDoubleRegister(instr->value());
|
|
|
| Label below_half, done;
|
| // xmm_scratch = 0.5
|
| @@ -2694,7 +2697,7 @@ void LCodeGen::DoMathRound(LUnaryMathOperation* instr) {
|
|
|
|
|
| void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) {
|
| - XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
| + XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| ASSERT(ToDoubleRegister(instr->result()).is(input_reg));
|
| __ sqrtsd(input_reg, input_reg);
|
| }
|
| @@ -2702,7 +2705,7 @@ void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) {
|
|
|
| void LCodeGen::DoMathPowHalf(LUnaryMathOperation* instr) {
|
| XMMRegister xmm_scratch = xmm0;
|
| - XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
| + XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| ASSERT(ToDoubleRegister(instr->result()).is(input_reg));
|
| __ xorps(xmm_scratch, xmm_scratch);
|
| __ addsd(input_reg, xmm_scratch); // Convert -0 to +0.
|
| @@ -2770,8 +2773,8 @@ void LCodeGen::DoPower(LPower* instr) {
|
|
|
|
|
| void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
|
| - ASSERT(instr->InputAt(0)->Equals(instr->result()));
|
| - XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
| + ASSERT(instr->value()->Equals(instr->result()));
|
| + XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| Label positive, done, zero;
|
| __ xorps(xmm0, xmm0);
|
| __ ucomisd(input_reg, xmm0);
|
| @@ -2803,7 +2806,7 @@ void LCodeGen::DoMathCos(LUnaryMathOperation* instr) {
|
| ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
|
| TranscendentalCacheStub stub(TranscendentalCache::COS,
|
| TranscendentalCacheStub::UNTAGGED);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -2811,7 +2814,7 @@ void LCodeGen::DoMathSin(LUnaryMathOperation* instr) {
|
| ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
|
| TranscendentalCacheStub stub(TranscendentalCache::SIN,
|
| TranscendentalCacheStub::UNTAGGED);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -2871,7 +2874,7 @@ void LCodeGen::DoCallKeyed(LCallKeyed* instr) {
|
| int arity = instr->arity();
|
| Handle<Code> ic = isolate()->stub_cache()->
|
| ComputeKeyedCallInitialize(arity, NOT_IN_LOOP);
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -2884,7 +2887,7 @@ void LCodeGen::DoCallNamed(LCallNamed* instr) {
|
| Handle<Code> ic =
|
| isolate()->stub_cache()->ComputeCallInitialize(arity, NOT_IN_LOOP, mode);
|
| __ mov(ecx, instr->name());
|
| - CallCode(ic, mode, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, mode, instr);
|
| }
|
|
|
|
|
| @@ -2894,7 +2897,7 @@ void LCodeGen::DoCallFunction(LCallFunction* instr) {
|
|
|
| int arity = instr->arity();
|
| CallFunctionStub stub(arity, NOT_IN_LOOP, RECEIVER_MIGHT_BE_IMPLICIT);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| __ Drop(1);
|
| }
|
|
|
| @@ -2908,7 +2911,7 @@ void LCodeGen::DoCallGlobal(LCallGlobal* instr) {
|
| Handle<Code> ic =
|
| isolate()->stub_cache()->ComputeCallInitialize(arity, NOT_IN_LOOP, mode);
|
| __ mov(ecx, instr->name());
|
| - CallCode(ic, mode, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, mode, instr);
|
| }
|
|
|
|
|
| @@ -2926,12 +2929,12 @@ void LCodeGen::DoCallNew(LCallNew* instr) {
|
|
|
| Handle<Code> builtin = isolate()->builtins()->JSConstructCall();
|
| __ Set(eax, Immediate(instr->arity()));
|
| - CallCode(builtin, RelocInfo::CONSTRUCT_CALL, instr, CONTEXT_ADJUSTED);
|
| + CallCode(builtin, RelocInfo::CONSTRUCT_CALL, instr);
|
| }
|
|
|
|
|
| void LCodeGen::DoCallRuntime(LCallRuntime* instr) {
|
| - CallRuntime(instr->function(), instr->arity(), instr, RESTORE_CONTEXT);
|
| + CallRuntime(instr->function(), instr->arity(), instr);
|
| }
|
|
|
|
|
| @@ -2974,7 +2977,7 @@ void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
|
| Handle<Code> ic = instr->strict_mode()
|
| ? isolate()->builtins()->StoreIC_Initialize_Strict()
|
| : isolate()->builtins()->StoreIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -3064,7 +3067,7 @@ void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
|
| Handle<Code> ic = instr->strict_mode()
|
| ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
|
| : isolate()->builtins()->KeyedStoreIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr, CONTEXT_ADJUSTED);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -3195,7 +3198,8 @@ void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) {
|
| __ SmiTag(index);
|
| __ push(index);
|
| }
|
| - CallRuntimeFromDeferred(Runtime::kStringCharCodeAt, 2, instr);
|
| + CallRuntimeFromDeferred(Runtime::kStringCharCodeAt, 2,
|
| + instr, instr->context());
|
| if (FLAG_debug_code) {
|
| __ AbortIfNotSmi(eax);
|
| }
|
| @@ -3246,7 +3250,7 @@ void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) {
|
| PushSafepointRegistersScope scope(this);
|
| __ SmiTag(char_code);
|
| __ push(char_code);
|
| - CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr);
|
| + CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context());
|
| __ StoreToSafepointRegisterSlot(result, eax);
|
| }
|
|
|
| @@ -3270,7 +3274,7 @@ void LCodeGen::DoStringAdd(LStringAdd* instr) {
|
| __ push(ToOperand(instr->right()));
|
| }
|
| StringAddStub stub(NO_STRING_CHECK_IN_STUB);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| }
|
|
|
|
|
| @@ -3331,8 +3335,15 @@ void LCodeGen::DoDeferredNumberTagI(LNumberTagI* instr) {
|
| // register is stored, as this register is in the pointer map, but contains an
|
| // integer value.
|
| __ StoreToSafepointRegisterSlot(reg, Immediate(0));
|
| -
|
| - CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr);
|
| + // NumberTagI and NumberTagD use the context from the frame, rather than
|
| + // the environment's HContext or HInlinedContext value.
|
| + // They only call Runtime::kAllocateHeapNumber.
|
| + // The corresponding HChange instructions are added in a phase that does
|
| + // not have easy access to the local context.
|
| + __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| + __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
|
| + RecordSafepointWithRegisters(
|
| + instr->pointer_map(), 0, Safepoint::kNoDeoptimizationIndex);
|
| if (!reg.is(eax)) __ mov(reg, eax);
|
|
|
| // Done. Put the value in xmm0 into the value of the allocated heap
|
| @@ -3376,7 +3387,15 @@ void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) {
|
| __ Set(reg, Immediate(0));
|
|
|
| PushSafepointRegistersScope scope(this);
|
| - CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr);
|
| + // NumberTagI and NumberTagD use the context from the frame, rather than
|
| + // the environment's HContext or HInlinedContext value.
|
| + // They only call Runtime::kAllocateHeapNumber.
|
| + // The corresponding HChange instructions are added in a phase that does
|
| + // not have easy access to the local context.
|
| + __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| + __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
|
| + RecordSafepointWithRegisters(instr->pointer_map(), 0,
|
| + Safepoint::kNoDeoptimizationIndex);
|
| __ StoreToSafepointRegisterSlot(reg, eax);
|
| }
|
|
|
| @@ -3846,6 +3865,7 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
|
|
|
|
| void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) {
|
| + ASSERT(ToRegister(instr->context()).is(esi));
|
| // Setup the parameters to the stub/runtime call.
|
| __ mov(eax, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
|
| __ push(FieldOperand(eax, JSFunction::kLiteralsOffset));
|
| @@ -3859,16 +3879,16 @@ void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) {
|
| FastCloneShallowArrayStub::Mode mode =
|
| FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS;
|
| FastCloneShallowArrayStub stub(mode, length);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| } else if (instr->hydrogen()->depth() > 1) {
|
| - CallRuntime(Runtime::kCreateArrayLiteral, 3, instr, RESTORE_CONTEXT);
|
| + CallRuntime(Runtime::kCreateArrayLiteral, 3, instr);
|
| } else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) {
|
| - CallRuntime(Runtime::kCreateArrayLiteralShallow, 3, instr, RESTORE_CONTEXT);
|
| + CallRuntime(Runtime::kCreateArrayLiteralShallow, 3, instr);
|
| } else {
|
| FastCloneShallowArrayStub::Mode mode =
|
| FastCloneShallowArrayStub::CLONE_ELEMENTS;
|
| FastCloneShallowArrayStub stub(mode, length);
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| }
|
| }
|
|
|
| @@ -3890,12 +3910,9 @@ void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) {
|
|
|
| // Pick the right runtime function to call.
|
| if (instr->hydrogen()->depth() > 1) {
|
| - CallRuntime(Runtime::kCreateObjectLiteral, 4, instr, CONTEXT_ADJUSTED);
|
| + CallRuntime(Runtime::kCreateObjectLiteral, 4, instr);
|
| } else {
|
| - CallRuntime(Runtime::kCreateObjectLiteralShallow,
|
| - 4,
|
| - instr,
|
| - CONTEXT_ADJUSTED);
|
| + CallRuntime(Runtime::kCreateObjectLiteralShallow, 4, instr);
|
| }
|
| }
|
|
|
| @@ -3903,17 +3920,19 @@ void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) {
|
| void LCodeGen::DoToFastProperties(LToFastProperties* instr) {
|
| ASSERT(ToRegister(instr->InputAt(0)).is(eax));
|
| __ push(eax);
|
| - CallRuntime(Runtime::kToFastProperties, 1, instr, CONTEXT_ADJUSTED);
|
| + CallRuntime(Runtime::kToFastProperties, 1, instr);
|
| }
|
|
|
|
|
| void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) {
|
| + ASSERT(ToRegister(instr->context()).is(esi));
|
| Label materialized;
|
| // Registers will be used as follows:
|
| // edi = JS function.
|
| // ecx = literals array.
|
| // ebx = regexp literal.
|
| // eax = regexp literal clone.
|
| + // esi = context.
|
| __ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
|
| __ mov(ecx, FieldOperand(edi, JSFunction::kLiteralsOffset));
|
| int literal_offset = FixedArray::kHeaderSize +
|
| @@ -3928,7 +3947,7 @@ void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) {
|
| __ push(Immediate(Smi::FromInt(instr->hydrogen()->literal_index())));
|
| __ push(Immediate(instr->hydrogen()->pattern()));
|
| __ push(Immediate(instr->hydrogen()->flags()));
|
| - CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr, RESTORE_CONTEXT);
|
| + CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr);
|
| __ mov(ebx, eax);
|
|
|
| __ bind(&materialized);
|
| @@ -3940,7 +3959,7 @@ void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) {
|
| __ bind(&runtime_allocate);
|
| __ push(ebx);
|
| __ push(Immediate(Smi::FromInt(size)));
|
| - CallRuntime(Runtime::kAllocateInNewSpace, 1, instr, RESTORE_CONTEXT);
|
| + CallRuntime(Runtime::kAllocateInNewSpace, 1, instr);
|
| __ pop(ebx);
|
|
|
| __ bind(&allocated);
|
| @@ -3960,6 +3979,7 @@ void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) {
|
|
|
|
|
| void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) {
|
| + ASSERT(ToRegister(instr->context()).is(esi));
|
| // Use the fast case closure allocation code that allocates in new
|
| // space for nested functions that don't need literals cloning.
|
| Handle<SharedFunctionInfo> shared_info = instr->shared_info();
|
| @@ -3968,26 +3988,26 @@ void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) {
|
| FastNewClosureStub stub(
|
| shared_info->strict_mode() ? kStrictMode : kNonStrictMode);
|
| __ push(Immediate(shared_info));
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| } else {
|
| __ push(Operand(ebp, StandardFrameConstants::kContextOffset));
|
| __ push(Immediate(shared_info));
|
| __ push(Immediate(pretenure
|
| ? factory()->true_value()
|
| : factory()->false_value()));
|
| - CallRuntime(Runtime::kNewClosure, 3, instr, RESTORE_CONTEXT);
|
| + CallRuntime(Runtime::kNewClosure, 3, instr);
|
| }
|
| }
|
|
|
|
|
| void LCodeGen::DoTypeof(LTypeof* instr) {
|
| - LOperand* input = instr->InputAt(0);
|
| + LOperand* input = instr->InputAt(1);
|
| if (input->IsConstantOperand()) {
|
| __ push(ToImmediate(input));
|
| } else {
|
| __ push(ToOperand(input));
|
| }
|
| - CallRuntime(Runtime::kTypeof, 1, instr, RESTORE_CONTEXT);
|
| + CallRuntime(Runtime::kTypeof, 1, instr);
|
| }
|
|
|
|
|
| @@ -4130,7 +4150,6 @@ void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) {
|
| SafepointGenerator safepoint_generator(this,
|
| pointers,
|
| env->deoptimization_index());
|
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| __ push(Immediate(Smi::FromInt(strict_mode_flag())));
|
| __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, safepoint_generator);
|
| }
|
| @@ -4138,7 +4157,7 @@ void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) {
|
|
|
| void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) {
|
| PushSafepointRegistersScope scope(this);
|
| - CallRuntimeFromDeferred(Runtime::kStackGuard, 0, instr);
|
| + CallRuntimeFromDeferred(Runtime::kStackGuard, 0, instr, instr->context());
|
| }
|
|
|
|
|
| @@ -4160,8 +4179,10 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
| __ cmp(esp, Operand::StaticVariable(stack_limit));
|
| __ j(above_equal, &done, Label::kNear);
|
|
|
| + ASSERT(instr->context()->IsRegister());
|
| + ASSERT(ToRegister(instr->context()).is(esi));
|
| StackCheckStub stub;
|
| - CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT);
|
| + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
| __ bind(&done);
|
| } else {
|
| ASSERT(instr->hydrogen()->is_backwards_branch());
|
| @@ -4219,7 +4240,6 @@ void LCodeGen::DoIn(LIn* instr) {
|
| SafepointGenerator safepoint_generator(this,
|
| pointers,
|
| env->deoptimization_index());
|
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator);
|
| }
|
|
|
|
|