| OLD | NEW | 
|     1 // Copyright 2013 the V8 project authors. All rights reserved. |     1 // Copyright 2013 the V8 project authors. All rights reserved. | 
|     2 // Redistribution and use in source and binary forms, with or without |     2 // Redistribution and use in source and binary forms, with or without | 
|     3 // modification, are permitted provided that the following conditions are |     3 // modification, are permitted provided that the following conditions are | 
|     4 // met: |     4 // met: | 
|     5 // |     5 // | 
|     6 //     * Redistributions of source code must retain the above copyright |     6 //     * Redistributions of source code must retain the above copyright | 
|     7 //       notice, this list of conditions and the following disclaimer. |     7 //       notice, this list of conditions and the following disclaimer. | 
|     8 //     * Redistributions in binary form must reproduce the above |     8 //     * Redistributions in binary form must reproduce the above | 
|     9 //       copyright notice, this list of conditions and the following |     9 //       copyright notice, this list of conditions and the following | 
|    10 //       disclaimer in the documentation and/or other materials provided |    10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   947 void LCodeGen::DoParameter(LParameter* instr) { |   947 void LCodeGen::DoParameter(LParameter* instr) { | 
|   948   // Nothing to do. |   948   // Nothing to do. | 
|   949 } |   949 } | 
|   950  |   950  | 
|   951  |   951  | 
|   952 void LCodeGen::DoCallStub(LCallStub* instr) { |   952 void LCodeGen::DoCallStub(LCallStub* instr) { | 
|   953   ASSERT(ToRegister(instr->result()).is(rax)); |   953   ASSERT(ToRegister(instr->result()).is(rax)); | 
|   954   switch (instr->hydrogen()->major_key()) { |   954   switch (instr->hydrogen()->major_key()) { | 
|   955     case CodeStub::RegExpConstructResult: { |   955     case CodeStub::RegExpConstructResult: { | 
|   956       RegExpConstructResultStub stub; |   956       RegExpConstructResultStub stub; | 
|   957       CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |   957       CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|   958       break; |   958       break; | 
|   959     } |   959     } | 
|   960     case CodeStub::RegExpExec: { |   960     case CodeStub::RegExpExec: { | 
|   961       RegExpExecStub stub; |   961       RegExpExecStub stub; | 
|   962       CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |   962       CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|   963       break; |   963       break; | 
|   964     } |   964     } | 
|   965     case CodeStub::SubString: { |   965     case CodeStub::SubString: { | 
|   966       SubStringStub stub; |   966       SubStringStub stub; | 
|   967       CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |   967       CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|   968       break; |   968       break; | 
|   969     } |   969     } | 
|   970     case CodeStub::NumberToString: { |   970     case CodeStub::NumberToString: { | 
|   971       NumberToStringStub stub; |   971       NumberToStringStub stub; | 
|   972       CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |   972       CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|   973       break; |   973       break; | 
|   974     } |   974     } | 
|   975     case CodeStub::StringAdd: { |   975     case CodeStub::StringAdd: { | 
|   976       StringAddStub stub(NO_STRING_ADD_FLAGS); |   976       StringAddStub stub(NO_STRING_ADD_FLAGS); | 
|   977       CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |   977       CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|   978       break; |   978       break; | 
|   979     } |   979     } | 
|   980     case CodeStub::StringCompare: { |   980     case CodeStub::StringCompare: { | 
|   981       StringCompareStub stub; |   981       StringCompareStub stub; | 
|   982       CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |   982       CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|   983       break; |   983       break; | 
|   984     } |   984     } | 
|   985     case CodeStub::TranscendentalCache: { |   985     case CodeStub::TranscendentalCache: { | 
|   986       TranscendentalCacheStub stub(instr->transcendental_type(), |   986       TranscendentalCacheStub stub(instr->transcendental_type(), | 
|   987                                    TranscendentalCacheStub::TAGGED); |   987                                    TranscendentalCacheStub::TAGGED); | 
|   988       CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |   988       CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|   989       break; |   989       break; | 
|   990     } |   990     } | 
|   991     default: |   991     default: | 
|   992       UNREACHABLE(); |   992       UNREACHABLE(); | 
|   993   } |   993   } | 
|   994 } |   994 } | 
|   995  |   995  | 
|   996  |   996  | 
|   997 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { |   997 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { | 
|   998   // Nothing to do. |   998   // Nothing to do. | 
| (...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1802   } |  1802   } | 
|  1803 } |  1803 } | 
|  1804  |  1804  | 
|  1805  |  1805  | 
|  1806 void LCodeGen::DoArithmeticT(LArithmeticT* instr) { |  1806 void LCodeGen::DoArithmeticT(LArithmeticT* instr) { | 
|  1807   ASSERT(ToRegister(instr->left()).is(rdx)); |  1807   ASSERT(ToRegister(instr->left()).is(rdx)); | 
|  1808   ASSERT(ToRegister(instr->right()).is(rax)); |  1808   ASSERT(ToRegister(instr->right()).is(rax)); | 
|  1809   ASSERT(ToRegister(instr->result()).is(rax)); |  1809   ASSERT(ToRegister(instr->result()).is(rax)); | 
|  1810  |  1810  | 
|  1811   BinaryOpStub stub(instr->op(), NO_OVERWRITE); |  1811   BinaryOpStub stub(instr->op(), NO_OVERWRITE); | 
|  1812   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  1812   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  1813   __ nop();  // Signals no inlined code. |  1813   __ nop();  // Signals no inlined code. | 
|  1814 } |  1814 } | 
|  1815  |  1815  | 
|  1816  |  1816  | 
|  1817 int LCodeGen::GetNextEmittedBlock(int block) { |  1817 int LCodeGen::GetNextEmittedBlock(int block) { | 
|  1818   for (int i = block + 1; i < graph()->blocks()->length(); ++i) { |  1818   for (int i = block + 1; i < graph()->blocks()->length(); ++i) { | 
|  1819     LLabel* label = chunk_->GetLabel(i); |  1819     LLabel* label = chunk_->GetLabel(i); | 
|  1820     if (!label->HasReplacement()) return i; |  1820     if (!label->HasReplacement()) return i; | 
|  1821   } |  1821   } | 
|  1822   return -1; |  1822   return -1; | 
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2196            Immediate(1 << Map::kIsUndetectable)); |  2196            Immediate(1 << Map::kIsUndetectable)); | 
|  2197   EmitBranch(true_block, false_block, not_zero); |  2197   EmitBranch(true_block, false_block, not_zero); | 
|  2198 } |  2198 } | 
|  2199  |  2199  | 
|  2200  |  2200  | 
|  2201 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { |  2201 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { | 
|  2202   Token::Value op = instr->op(); |  2202   Token::Value op = instr->op(); | 
|  2203   int true_block = chunk_->LookupDestination(instr->true_block_id()); |  2203   int true_block = chunk_->LookupDestination(instr->true_block_id()); | 
|  2204   int false_block = chunk_->LookupDestination(instr->false_block_id()); |  2204   int false_block = chunk_->LookupDestination(instr->false_block_id()); | 
|  2205  |  2205  | 
|  2206   Handle<Code> ic = CompareIC::GetUninitialized(op); |  2206   Handle<Code> ic = CompareIC::GetUninitialized(isolate(), op); | 
|  2207   CallCode(ic, RelocInfo::CODE_TARGET, instr); |  2207   CallCode(ic, RelocInfo::CODE_TARGET, instr); | 
|  2208  |  2208  | 
|  2209   Condition condition = TokenToCondition(op, false); |  2209   Condition condition = TokenToCondition(op, false); | 
|  2210   __ testq(rax, rax); |  2210   __ testq(rax, rax); | 
|  2211  |  2211  | 
|  2212   EmitBranch(true_block, false_block, condition); |  2212   EmitBranch(true_block, false_block, condition); | 
|  2213 } |  2213 } | 
|  2214  |  2214  | 
|  2215  |  2215  | 
|  2216 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) { |  2216 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) { | 
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2366  |  2366  | 
|  2367   __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), instr->map()); |  2367   __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), instr->map()); | 
|  2368   EmitBranch(true_block, false_block, equal); |  2368   EmitBranch(true_block, false_block, equal); | 
|  2369 } |  2369 } | 
|  2370  |  2370  | 
|  2371  |  2371  | 
|  2372 void LCodeGen::DoInstanceOf(LInstanceOf* instr) { |  2372 void LCodeGen::DoInstanceOf(LInstanceOf* instr) { | 
|  2373   InstanceofStub stub(InstanceofStub::kNoFlags); |  2373   InstanceofStub stub(InstanceofStub::kNoFlags); | 
|  2374   __ push(ToRegister(instr->left())); |  2374   __ push(ToRegister(instr->left())); | 
|  2375   __ push(ToRegister(instr->right())); |  2375   __ push(ToRegister(instr->right())); | 
|  2376   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  2376   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  2377   Label true_value, done; |  2377   Label true_value, done; | 
|  2378   __ testq(rax, rax); |  2378   __ testq(rax, rax); | 
|  2379   __ j(zero, &true_value, Label::kNear); |  2379   __ j(zero, &true_value, Label::kNear); | 
|  2380   __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); |  2380   __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); | 
|  2381   __ jmp(&done, Label::kNear); |  2381   __ jmp(&done, Label::kNear); | 
|  2382   __ bind(&true_value); |  2382   __ bind(&true_value); | 
|  2383   __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); |  2383   __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); | 
|  2384   __ bind(&done); |  2384   __ bind(&done); | 
|  2385 } |  2385 } | 
|  2386  |  2386  | 
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2465     static const int kAdditionalDelta = 10; |  2465     static const int kAdditionalDelta = 10; | 
|  2466     int delta = |  2466     int delta = | 
|  2467         masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; |  2467         masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; | 
|  2468     ASSERT(delta >= 0); |  2468     ASSERT(delta >= 0); | 
|  2469     __ push_imm32(delta); |  2469     __ push_imm32(delta); | 
|  2470  |  2470  | 
|  2471     // We are pushing three values on the stack but recording a |  2471     // We are pushing three values on the stack but recording a | 
|  2472     // safepoint with two arguments because stub is going to |  2472     // safepoint with two arguments because stub is going to | 
|  2473     // remove the third argument from the stack before jumping |  2473     // remove the third argument from the stack before jumping | 
|  2474     // to instanceof builtin on the slow path. |  2474     // to instanceof builtin on the slow path. | 
|  2475     CallCodeGeneric(stub.GetCode(), |  2475     CallCodeGeneric(stub.GetCode(isolate()), | 
|  2476                     RelocInfo::CODE_TARGET, |  2476                     RelocInfo::CODE_TARGET, | 
|  2477                     instr, |  2477                     instr, | 
|  2478                     RECORD_SAFEPOINT_WITH_REGISTERS, |  2478                     RECORD_SAFEPOINT_WITH_REGISTERS, | 
|  2479                     2); |  2479                     2); | 
|  2480     ASSERT(delta == masm_->SizeOfCodeGeneratedSince(map_check)); |  2480     ASSERT(delta == masm_->SizeOfCodeGeneratedSince(map_check)); | 
|  2481     LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment(); |  2481     LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment(); | 
|  2482     safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |  2482     safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 
|  2483     // Move result to a register that survives the end of the |  2483     // Move result to a register that survives the end of the | 
|  2484     // PushSafepointRegisterScope. |  2484     // PushSafepointRegisterScope. | 
|  2485     __ movq(kScratchRegister, rax); |  2485     __ movq(kScratchRegister, rax); | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|  2500   Register object = ToRegister(instr->object()); |  2500   Register object = ToRegister(instr->object()); | 
|  2501   Register result = ToRegister(instr->result()); |  2501   Register result = ToRegister(instr->result()); | 
|  2502   __ movq(result, FieldOperand(object, HeapObject::kMapOffset)); |  2502   __ movq(result, FieldOperand(object, HeapObject::kMapOffset)); | 
|  2503   __ movzxbq(result, FieldOperand(result, Map::kInstanceSizeOffset)); |  2503   __ movzxbq(result, FieldOperand(result, Map::kInstanceSizeOffset)); | 
|  2504 } |  2504 } | 
|  2505  |  2505  | 
|  2506  |  2506  | 
|  2507 void LCodeGen::DoCmpT(LCmpT* instr) { |  2507 void LCodeGen::DoCmpT(LCmpT* instr) { | 
|  2508   Token::Value op = instr->op(); |  2508   Token::Value op = instr->op(); | 
|  2509  |  2509  | 
|  2510   Handle<Code> ic = CompareIC::GetUninitialized(op); |  2510   Handle<Code> ic = CompareIC::GetUninitialized(isolate(), op); | 
|  2511   CallCode(ic, RelocInfo::CODE_TARGET, instr); |  2511   CallCode(ic, RelocInfo::CODE_TARGET, instr); | 
|  2512  |  2512  | 
|  2513   Condition condition = TokenToCondition(op, false); |  2513   Condition condition = TokenToCondition(op, false); | 
|  2514   Label true_value, done; |  2514   Label true_value, done; | 
|  2515   __ testq(rax, rax); |  2515   __ testq(rax, rax); | 
|  2516   __ j(condition, &true_value, Label::kNear); |  2516   __ j(condition, &true_value, Label::kNear); | 
|  2517   __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); |  2517   __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); | 
|  2518   __ jmp(&done, Label::kNear); |  2518   __ jmp(&done, Label::kNear); | 
|  2519   __ bind(&true_value); |  2519   __ bind(&true_value); | 
|  2520   __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); |  2520   __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); | 
| (...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3734   Register temp2 = ToRegister(instr->temp2()); |  3734   Register temp2 = ToRegister(instr->temp2()); | 
|  3735  |  3735  | 
|  3736   MathExpGenerator::EmitMathExp(masm(), input, result, xmm0, temp1, temp2); |  3736   MathExpGenerator::EmitMathExp(masm(), input, result, xmm0, temp1, temp2); | 
|  3737 } |  3737 } | 
|  3738  |  3738  | 
|  3739  |  3739  | 
|  3740 void LCodeGen::DoMathLog(LUnaryMathOperation* instr) { |  3740 void LCodeGen::DoMathLog(LUnaryMathOperation* instr) { | 
|  3741   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); |  3741   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); | 
|  3742   TranscendentalCacheStub stub(TranscendentalCache::LOG, |  3742   TranscendentalCacheStub stub(TranscendentalCache::LOG, | 
|  3743                                TranscendentalCacheStub::UNTAGGED); |  3743                                TranscendentalCacheStub::UNTAGGED); | 
|  3744   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  3744   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  3745 } |  3745 } | 
|  3746  |  3746  | 
|  3747  |  3747  | 
|  3748 void LCodeGen::DoMathTan(LUnaryMathOperation* instr) { |  3748 void LCodeGen::DoMathTan(LUnaryMathOperation* instr) { | 
|  3749   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); |  3749   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); | 
|  3750   TranscendentalCacheStub stub(TranscendentalCache::TAN, |  3750   TranscendentalCacheStub stub(TranscendentalCache::TAN, | 
|  3751                                TranscendentalCacheStub::UNTAGGED); |  3751                                TranscendentalCacheStub::UNTAGGED); | 
|  3752   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  3752   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  3753 } |  3753 } | 
|  3754  |  3754  | 
|  3755  |  3755  | 
|  3756 void LCodeGen::DoMathCos(LUnaryMathOperation* instr) { |  3756 void LCodeGen::DoMathCos(LUnaryMathOperation* instr) { | 
|  3757   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); |  3757   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); | 
|  3758   TranscendentalCacheStub stub(TranscendentalCache::COS, |  3758   TranscendentalCacheStub stub(TranscendentalCache::COS, | 
|  3759                                TranscendentalCacheStub::UNTAGGED); |  3759                                TranscendentalCacheStub::UNTAGGED); | 
|  3760   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  3760   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  3761 } |  3761 } | 
|  3762  |  3762  | 
|  3763  |  3763  | 
|  3764 void LCodeGen::DoMathSin(LUnaryMathOperation* instr) { |  3764 void LCodeGen::DoMathSin(LUnaryMathOperation* instr) { | 
|  3765   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); |  3765   ASSERT(ToDoubleRegister(instr->result()).is(xmm1)); | 
|  3766   TranscendentalCacheStub stub(TranscendentalCache::SIN, |  3766   TranscendentalCacheStub stub(TranscendentalCache::SIN, | 
|  3767                                TranscendentalCacheStub::UNTAGGED); |  3767                                TranscendentalCacheStub::UNTAGGED); | 
|  3768   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  3768   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  3769 } |  3769 } | 
|  3770  |  3770  | 
|  3771  |  3771  | 
|  3772 void LCodeGen::DoUnaryMathOperation(LUnaryMathOperation* instr) { |  3772 void LCodeGen::DoUnaryMathOperation(LUnaryMathOperation* instr) { | 
|  3773   switch (instr->op()) { |  3773   switch (instr->op()) { | 
|  3774     case kMathAbs: |  3774     case kMathAbs: | 
|  3775       DoMathAbs(instr); |  3775       DoMathAbs(instr); | 
|  3776       break; |  3776       break; | 
|  3777     case kMathFloor: |  3777     case kMathFloor: | 
|  3778       DoMathFloor(instr); |  3778       DoMathFloor(instr); | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3850   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |  3850   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 
|  3851 } |  3851 } | 
|  3852  |  3852  | 
|  3853  |  3853  | 
|  3854 void LCodeGen::DoCallFunction(LCallFunction* instr) { |  3854 void LCodeGen::DoCallFunction(LCallFunction* instr) { | 
|  3855   ASSERT(ToRegister(instr->function()).is(rdi)); |  3855   ASSERT(ToRegister(instr->function()).is(rdi)); | 
|  3856   ASSERT(ToRegister(instr->result()).is(rax)); |  3856   ASSERT(ToRegister(instr->result()).is(rax)); | 
|  3857  |  3857  | 
|  3858   int arity = instr->arity(); |  3858   int arity = instr->arity(); | 
|  3859   CallFunctionStub stub(arity, NO_CALL_FUNCTION_FLAGS); |  3859   CallFunctionStub stub(arity, NO_CALL_FUNCTION_FLAGS); | 
|  3860   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  3860   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  3861   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |  3861   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 
|  3862 } |  3862 } | 
|  3863  |  3863  | 
|  3864  |  3864  | 
|  3865 void LCodeGen::DoCallGlobal(LCallGlobal* instr) { |  3865 void LCodeGen::DoCallGlobal(LCallGlobal* instr) { | 
|  3866   ASSERT(ToRegister(instr->result()).is(rax)); |  3866   ASSERT(ToRegister(instr->result()).is(rax)); | 
|  3867   int arity = instr->arity(); |  3867   int arity = instr->arity(); | 
|  3868   RelocInfo::Mode mode = RelocInfo::CODE_TARGET_CONTEXT; |  3868   RelocInfo::Mode mode = RelocInfo::CODE_TARGET_CONTEXT; | 
|  3869   Handle<Code> ic = |  3869   Handle<Code> ic = | 
|  3870       isolate()->stub_cache()->ComputeCallInitialize(arity, mode); |  3870       isolate()->stub_cache()->ComputeCallInitialize(arity, mode); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  3883                     RDI_UNINITIALIZED); |  3883                     RDI_UNINITIALIZED); | 
|  3884 } |  3884 } | 
|  3885  |  3885  | 
|  3886  |  3886  | 
|  3887 void LCodeGen::DoCallNew(LCallNew* instr) { |  3887 void LCodeGen::DoCallNew(LCallNew* instr) { | 
|  3888   ASSERT(ToRegister(instr->constructor()).is(rdi)); |  3888   ASSERT(ToRegister(instr->constructor()).is(rdi)); | 
|  3889   ASSERT(ToRegister(instr->result()).is(rax)); |  3889   ASSERT(ToRegister(instr->result()).is(rax)); | 
|  3890  |  3890  | 
|  3891   CallConstructStub stub(NO_CALL_FUNCTION_FLAGS); |  3891   CallConstructStub stub(NO_CALL_FUNCTION_FLAGS); | 
|  3892   __ Set(rax, instr->arity()); |  3892   __ Set(rax, instr->arity()); | 
|  3893   CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr); |  3893   CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); | 
|  3894 } |  3894 } | 
|  3895  |  3895  | 
|  3896  |  3896  | 
|  3897 void LCodeGen::DoCallRuntime(LCallRuntime* instr) { |  3897 void LCodeGen::DoCallRuntime(LCallRuntime* instr) { | 
|  3898   CallRuntime(instr->function(), instr->arity(), instr); |  3898   CallRuntime(instr->function(), instr->arity(), instr); | 
|  3899 } |  3899 } | 
|  3900  |  3900  | 
|  3901  |  3901  | 
|  3902 void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |  3902 void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { | 
|  3903   Register object = ToRegister(instr->object()); |  3903   Register object = ToRegister(instr->object()); | 
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4251   Register temp = ToRegister(instr->temp()); |  4251   Register temp = ToRegister(instr->temp()); | 
|  4252   __ TestJSArrayForAllocationSiteInfo(object, temp); |  4252   __ TestJSArrayForAllocationSiteInfo(object, temp); | 
|  4253   DeoptimizeIf(equal, instr->environment()); |  4253   DeoptimizeIf(equal, instr->environment()); | 
|  4254 } |  4254 } | 
|  4255  |  4255  | 
|  4256  |  4256  | 
|  4257 void LCodeGen::DoStringAdd(LStringAdd* instr) { |  4257 void LCodeGen::DoStringAdd(LStringAdd* instr) { | 
|  4258   EmitPushTaggedOperand(instr->left()); |  4258   EmitPushTaggedOperand(instr->left()); | 
|  4259   EmitPushTaggedOperand(instr->right()); |  4259   EmitPushTaggedOperand(instr->right()); | 
|  4260   StringAddStub stub(NO_STRING_CHECK_IN_STUB); |  4260   StringAddStub stub(NO_STRING_CHECK_IN_STUB); | 
|  4261   CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  4261   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  4262 } |  4262 } | 
|  4263  |  4263  | 
|  4264  |  4264  | 
|  4265 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { |  4265 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { | 
|  4266   class DeferredStringCharCodeAt: public LDeferredCode { |  4266   class DeferredStringCharCodeAt: public LDeferredCode { | 
|  4267    public: |  4267    public: | 
|  4268     DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) |  4268     DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) | 
|  4269         : LDeferredCode(codegen), instr_(instr) { } |  4269         : LDeferredCode(codegen), instr_(instr) { } | 
|  4270     virtual void Generate() { codegen()->DoDeferredStringCharCodeAt(instr_); } |  4270     virtual void Generate() { codegen()->DoDeferredStringCharCodeAt(instr_); } | 
|  4271     virtual LInstruction* instr() { return instr_; } |  4271     virtual LInstruction* instr() { return instr_; } | 
| (...skipping 854 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5126   // Pass an empty fixed array. |  5126   // Pass an empty fixed array. | 
|  5127   __ Push(isolate()->factory()->empty_fixed_array()); |  5127   __ Push(isolate()->factory()->empty_fixed_array()); | 
|  5128  |  5128  | 
|  5129   // Pick the right runtime function or stub to call. |  5129   // Pick the right runtime function or stub to call. | 
|  5130   int length = instr->hydrogen()->length(); |  5130   int length = instr->hydrogen()->length(); | 
|  5131   if (instr->hydrogen()->IsCopyOnWrite()) { |  5131   if (instr->hydrogen()->IsCopyOnWrite()) { | 
|  5132     ASSERT(instr->hydrogen()->depth() == 1); |  5132     ASSERT(instr->hydrogen()->depth() == 1); | 
|  5133     FastCloneShallowArrayStub::Mode mode = |  5133     FastCloneShallowArrayStub::Mode mode = | 
|  5134         FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS; |  5134         FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS; | 
|  5135     FastCloneShallowArrayStub stub(mode, DONT_TRACK_ALLOCATION_SITE, length); |  5135     FastCloneShallowArrayStub stub(mode, DONT_TRACK_ALLOCATION_SITE, length); | 
|  5136     CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  5136     CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  5137   } else if (instr->hydrogen()->depth() > 1) { |  5137   } else if (instr->hydrogen()->depth() > 1) { | 
|  5138     CallRuntime(Runtime::kCreateArrayLiteral, 3, instr); |  5138     CallRuntime(Runtime::kCreateArrayLiteral, 3, instr); | 
|  5139   } else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) { |  5139   } else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) { | 
|  5140     CallRuntime(Runtime::kCreateArrayLiteralShallow, 3, instr); |  5140     CallRuntime(Runtime::kCreateArrayLiteralShallow, 3, instr); | 
|  5141   } else { |  5141   } else { | 
|  5142     FastCloneShallowArrayStub::Mode mode = |  5142     FastCloneShallowArrayStub::Mode mode = | 
|  5143         boilerplate_elements_kind == FAST_DOUBLE_ELEMENTS |  5143         boilerplate_elements_kind == FAST_DOUBLE_ELEMENTS | 
|  5144         ? FastCloneShallowArrayStub::CLONE_DOUBLE_ELEMENTS |  5144         ? FastCloneShallowArrayStub::CLONE_DOUBLE_ELEMENTS | 
|  5145         : FastCloneShallowArrayStub::CLONE_ELEMENTS; |  5145         : FastCloneShallowArrayStub::CLONE_ELEMENTS; | 
|  5146     FastCloneShallowArrayStub stub(mode, allocation_site_mode, length); |  5146     FastCloneShallowArrayStub stub(mode, allocation_site_mode, length); | 
|  5147     CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  5147     CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  5148   } |  5148   } | 
|  5149 } |  5149 } | 
|  5150  |  5150  | 
|  5151  |  5151  | 
|  5152 void LCodeGen::EmitDeepCopy(Handle<JSObject> object, |  5152 void LCodeGen::EmitDeepCopy(Handle<JSObject> object, | 
|  5153                             Register result, |  5153                             Register result, | 
|  5154                             Register source, |  5154                             Register source, | 
|  5155                             int* offset, |  5155                             int* offset, | 
|  5156                             AllocationSiteMode mode) { |  5156                             AllocationSiteMode mode) { | 
|  5157   ASSERT(!source.is(rcx)); |  5157   ASSERT(!source.is(rcx)); | 
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5333     __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); |  5333     __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); | 
|  5334     __ Push(constant_properties); |  5334     __ Push(constant_properties); | 
|  5335     __ Push(Smi::FromInt(flags)); |  5335     __ Push(Smi::FromInt(flags)); | 
|  5336     CallRuntime(Runtime::kCreateObjectLiteralShallow, 4, instr); |  5336     CallRuntime(Runtime::kCreateObjectLiteralShallow, 4, instr); | 
|  5337   } else { |  5337   } else { | 
|  5338     __ LoadHeapObject(rax, literals); |  5338     __ LoadHeapObject(rax, literals); | 
|  5339     __ Move(rbx, Smi::FromInt(instr->hydrogen()->literal_index())); |  5339     __ Move(rbx, Smi::FromInt(instr->hydrogen()->literal_index())); | 
|  5340     __ Move(rcx, constant_properties); |  5340     __ Move(rcx, constant_properties); | 
|  5341     __ Move(rdx, Smi::FromInt(flags)); |  5341     __ Move(rdx, Smi::FromInt(flags)); | 
|  5342     FastCloneShallowObjectStub stub(properties_count); |  5342     FastCloneShallowObjectStub stub(properties_count); | 
|  5343     CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  5343     CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  5344   } |  5344   } | 
|  5345 } |  5345 } | 
|  5346  |  5346  | 
|  5347  |  5347  | 
|  5348 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { |  5348 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { | 
|  5349   ASSERT(ToRegister(instr->value()).is(rax)); |  5349   ASSERT(ToRegister(instr->value()).is(rax)); | 
|  5350   __ push(rax); |  5350   __ push(rax); | 
|  5351   CallRuntime(Runtime::kToFastProperties, 1, instr); |  5351   CallRuntime(Runtime::kToFastProperties, 1, instr); | 
|  5352 } |  5352 } | 
|  5353  |  5353  | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5403  |  5403  | 
|  5404  |  5404  | 
|  5405 void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { |  5405 void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { | 
|  5406   // Use the fast case closure allocation code that allocates in new |  5406   // Use the fast case closure allocation code that allocates in new | 
|  5407   // space for nested functions that don't need literals cloning. |  5407   // space for nested functions that don't need literals cloning. | 
|  5408   Handle<SharedFunctionInfo> shared_info = instr->shared_info(); |  5408   Handle<SharedFunctionInfo> shared_info = instr->shared_info(); | 
|  5409   bool pretenure = instr->hydrogen()->pretenure(); |  5409   bool pretenure = instr->hydrogen()->pretenure(); | 
|  5410   if (!pretenure && shared_info->num_literals() == 0) { |  5410   if (!pretenure && shared_info->num_literals() == 0) { | 
|  5411     FastNewClosureStub stub(shared_info->language_mode()); |  5411     FastNewClosureStub stub(shared_info->language_mode()); | 
|  5412     __ Push(shared_info); |  5412     __ Push(shared_info); | 
|  5413     CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  5413     CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  5414   } else { |  5414   } else { | 
|  5415     __ push(rsi); |  5415     __ push(rsi); | 
|  5416     __ Push(shared_info); |  5416     __ Push(shared_info); | 
|  5417     __ PushRoot(pretenure ? |  5417     __ PushRoot(pretenure ? | 
|  5418                 Heap::kTrueValueRootIndex : |  5418                 Heap::kTrueValueRootIndex : | 
|  5419                 Heap::kFalseValueRootIndex); |  5419                 Heap::kFalseValueRootIndex); | 
|  5420     CallRuntime(Runtime::kNewClosure, 3, instr); |  5420     CallRuntime(Runtime::kNewClosure, 3, instr); | 
|  5421   } |  5421   } | 
|  5422 } |  5422 } | 
|  5423  |  5423  | 
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5649   ASSERT(instr->HasEnvironment()); |  5649   ASSERT(instr->HasEnvironment()); | 
|  5650   LEnvironment* env = instr->environment(); |  5650   LEnvironment* env = instr->environment(); | 
|  5651   // There is no LLazyBailout instruction for stack-checks. We have to |  5651   // There is no LLazyBailout instruction for stack-checks. We have to | 
|  5652   // prepare for lazy deoptimization explicitly here. |  5652   // prepare for lazy deoptimization explicitly here. | 
|  5653   if (instr->hydrogen()->is_function_entry()) { |  5653   if (instr->hydrogen()->is_function_entry()) { | 
|  5654     // Perform stack overflow check. |  5654     // Perform stack overflow check. | 
|  5655     Label done; |  5655     Label done; | 
|  5656     __ CompareRoot(rsp, Heap::kStackLimitRootIndex); |  5656     __ CompareRoot(rsp, Heap::kStackLimitRootIndex); | 
|  5657     __ j(above_equal, &done, Label::kNear); |  5657     __ j(above_equal, &done, Label::kNear); | 
|  5658     StackCheckStub stub; |  5658     StackCheckStub stub; | 
|  5659     CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |  5659     CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
|  5660     EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); |  5660     EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); | 
|  5661     last_lazy_deopt_pc_ = masm()->pc_offset(); |  5661     last_lazy_deopt_pc_ = masm()->pc_offset(); | 
|  5662     __ bind(&done); |  5662     __ bind(&done); | 
|  5663     RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); |  5663     RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); | 
|  5664     safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |  5664     safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 
|  5665   } else { |  5665   } else { | 
|  5666     ASSERT(instr->hydrogen()->is_backwards_branch()); |  5666     ASSERT(instr->hydrogen()->is_backwards_branch()); | 
|  5667     // Perform stack overflow check if this goto needs it before jumping. |  5667     // Perform stack overflow check if this goto needs it before jumping. | 
|  5668     DeferredStackCheck* deferred_stack_check = |  5668     DeferredStackCheck* deferred_stack_check = | 
|  5669         new(zone()) DeferredStackCheck(this, instr); |  5669         new(zone()) DeferredStackCheck(this, instr); | 
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5785                                FixedArray::kHeaderSize - kPointerSize)); |  5785                                FixedArray::kHeaderSize - kPointerSize)); | 
|  5786   __ bind(&done); |  5786   __ bind(&done); | 
|  5787 } |  5787 } | 
|  5788  |  5788  | 
|  5789  |  5789  | 
|  5790 #undef __ |  5790 #undef __ | 
|  5791  |  5791  | 
|  5792 } }  // namespace v8::internal |  5792 } }  // namespace v8::internal | 
|  5793  |  5793  | 
|  5794 #endif  // V8_TARGET_ARCH_X64 |  5794 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW |