OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 return masm->TryCallApiFunctionAndReturn(&fun, | 479 return masm->TryCallApiFunctionAndReturn(&fun, |
480 argc + kFastApiCallArguments + 1); | 480 argc + kFastApiCallArguments + 1); |
481 } | 481 } |
482 | 482 |
483 | 483 |
484 class CallInterceptorCompiler BASE_EMBEDDED { | 484 class CallInterceptorCompiler BASE_EMBEDDED { |
485 public: | 485 public: |
486 CallInterceptorCompiler(StubCompiler* stub_compiler, | 486 CallInterceptorCompiler(StubCompiler* stub_compiler, |
487 const ParameterCount& arguments, | 487 const ParameterCount& arguments, |
488 Register name, | 488 Register name, |
489 Code::ExtraICState extra_ic_state) | 489 Code::ExtraICState extra_state) |
490 : stub_compiler_(stub_compiler), | 490 : stub_compiler_(stub_compiler), |
491 arguments_(arguments), | 491 arguments_(arguments), |
492 name_(name), | 492 name_(name), |
493 extra_ic_state_(extra_ic_state) {} | 493 extra_state_(extra_state) {} |
494 | 494 |
495 MaybeObject* Compile(MacroAssembler* masm, | 495 MaybeObject* Compile(MacroAssembler* masm, |
496 JSObject* object, | 496 JSObject* object, |
497 JSObject* holder, | 497 JSObject* holder, |
498 String* name, | 498 String* name, |
499 LookupResult* lookup, | 499 LookupResult* lookup, |
500 Register receiver, | 500 Register receiver, |
501 Register scratch1, | 501 Register scratch1, |
502 Register scratch2, | 502 Register scratch2, |
503 Register scratch3, | 503 Register scratch3, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 // by the previous CheckPrototypes. | 607 // by the previous CheckPrototypes. |
608 ASSERT(depth2 == kInvalidProtoDepth); | 608 ASSERT(depth2 == kInvalidProtoDepth); |
609 } | 609 } |
610 | 610 |
611 // Invoke function. | 611 // Invoke function. |
612 if (can_do_fast_api_call) { | 612 if (can_do_fast_api_call) { |
613 MaybeObject* result = | 613 MaybeObject* result = |
614 GenerateFastApiCall(masm, optimization, arguments_.immediate()); | 614 GenerateFastApiCall(masm, optimization, arguments_.immediate()); |
615 if (result->IsFailure()) return result; | 615 if (result->IsFailure()) return result; |
616 } else { | 616 } else { |
617 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 617 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
618 ? CALL_AS_FUNCTION | 618 ? CALL_AS_FUNCTION |
619 : CALL_AS_METHOD; | 619 : CALL_AS_METHOD; |
620 __ InvokeFunction(optimization.constant_function(), arguments_, | 620 __ InvokeFunction(optimization.constant_function(), arguments_, |
621 JUMP_FUNCTION, NullCallWrapper(), call_kind); | 621 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
622 } | 622 } |
623 | 623 |
624 // Deferred code for fast API call case---clean preallocated space. | 624 // Deferred code for fast API call case---clean preallocated space. |
625 if (can_do_fast_api_call) { | 625 if (can_do_fast_api_call) { |
626 __ bind(&miss_cleanup); | 626 __ bind(&miss_cleanup); |
627 FreeSpaceForFastApiCall(masm, scratch1); | 627 FreeSpaceForFastApiCall(masm, scratch1); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 // Leave the internal frame. | 693 // Leave the internal frame. |
694 } | 694 } |
695 | 695 |
696 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel()); | 696 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel()); |
697 __ j(not_equal, interceptor_succeeded); | 697 __ j(not_equal, interceptor_succeeded); |
698 } | 698 } |
699 | 699 |
700 StubCompiler* stub_compiler_; | 700 StubCompiler* stub_compiler_; |
701 const ParameterCount& arguments_; | 701 const ParameterCount& arguments_; |
702 Register name_; | 702 Register name_; |
703 Code::ExtraICState extra_ic_state_; | 703 Code::ExtraICState extra_state_; |
704 }; | 704 }; |
705 | 705 |
706 | 706 |
707 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { | 707 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { |
708 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); | 708 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); |
709 Code* code = NULL; | 709 Code* code = NULL; |
710 if (kind == Code::LOAD_IC) { | 710 if (kind == Code::LOAD_IC) { |
711 code = masm->isolate()->builtins()->builtin(Builtins::kLoadIC_Miss); | 711 code = masm->isolate()->builtins()->builtin(Builtins::kLoadIC_Miss); |
712 } else { | 712 } else { |
713 code = masm->isolate()->builtins()->builtin(Builtins::kKeyedLoadIC_Miss); | 713 code = masm->isolate()->builtins()->builtin(Builtins::kKeyedLoadIC_Miss); |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 __ j(not_equal, miss); | 1330 __ j(not_equal, miss); |
1331 } else { | 1331 } else { |
1332 __ cmp(edi, Immediate(Handle<JSFunction>(function))); | 1332 __ cmp(edi, Immediate(Handle<JSFunction>(function))); |
1333 __ j(not_equal, miss); | 1333 __ j(not_equal, miss); |
1334 } | 1334 } |
1335 } | 1335 } |
1336 | 1336 |
1337 | 1337 |
1338 MaybeObject* CallStubCompiler::GenerateMissBranch() { | 1338 MaybeObject* CallStubCompiler::GenerateMissBranch() { |
1339 MaybeObject* maybe_obj = | 1339 MaybeObject* maybe_obj = |
1340 isolate()->stub_cache()->ComputeCallMiss(arguments().immediate(), | 1340 isolate()->stub_cache()->TryComputeCallMiss(arguments().immediate(), |
1341 kind_, | 1341 kind_, |
1342 extra_ic_state_); | 1342 extra_state_); |
1343 Object* obj; | 1343 Object* obj; |
1344 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 1344 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
1345 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); | 1345 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); |
1346 return obj; | 1346 return obj; |
1347 } | 1347 } |
1348 | 1348 |
1349 | 1349 |
1350 MUST_USE_RESULT MaybeObject* CallStubCompiler::CompileCallField( | 1350 MUST_USE_RESULT MaybeObject* CallStubCompiler::CompileCallField( |
1351 JSObject* object, | 1351 JSObject* object, |
1352 JSObject* holder, | 1352 JSObject* holder, |
(...skipping 29 matching lines...) Expand all Loading... |
1382 __ j(not_equal, &miss); | 1382 __ j(not_equal, &miss); |
1383 | 1383 |
1384 // Patch the receiver on the stack with the global proxy if | 1384 // Patch the receiver on the stack with the global proxy if |
1385 // necessary. | 1385 // necessary. |
1386 if (object->IsGlobalObject()) { | 1386 if (object->IsGlobalObject()) { |
1387 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 1387 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
1388 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 1388 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
1389 } | 1389 } |
1390 | 1390 |
1391 // Invoke the function. | 1391 // Invoke the function. |
1392 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 1392 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
1393 ? CALL_AS_FUNCTION | 1393 ? CALL_AS_FUNCTION |
1394 : CALL_AS_METHOD; | 1394 : CALL_AS_METHOD; |
1395 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, | 1395 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, |
1396 NullCallWrapper(), call_kind); | 1396 NullCallWrapper(), call_kind); |
1397 | 1397 |
1398 // Handle call cache miss. | 1398 // Handle call cache miss. |
1399 __ bind(&miss); | 1399 __ bind(&miss); |
1400 MaybeObject* maybe_result = GenerateMissBranch(); | 1400 MaybeObject* maybe_result = GenerateMissBranch(); |
1401 if (maybe_result->IsFailure()) return maybe_result; | 1401 if (maybe_result->IsFailure()) return maybe_result; |
1402 | 1402 |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1693 } | 1693 } |
1694 | 1694 |
1695 const int argc = arguments().immediate(); | 1695 const int argc = arguments().immediate(); |
1696 | 1696 |
1697 Label miss; | 1697 Label miss; |
1698 Label name_miss; | 1698 Label name_miss; |
1699 Label index_out_of_range; | 1699 Label index_out_of_range; |
1700 Label* index_out_of_range_label = &index_out_of_range; | 1700 Label* index_out_of_range_label = &index_out_of_range; |
1701 | 1701 |
1702 if (kind_ == Code::CALL_IC && | 1702 if (kind_ == Code::CALL_IC && |
1703 (CallICBase::StringStubState::decode(extra_ic_state_) == | 1703 (CallICBase::StringStubState::decode(extra_state_) == |
1704 DEFAULT_STRING_STUB)) { | 1704 DEFAULT_STRING_STUB)) { |
1705 index_out_of_range_label = &miss; | 1705 index_out_of_range_label = &miss; |
1706 } | 1706 } |
1707 | 1707 |
1708 GenerateNameCheck(name, &name_miss); | 1708 GenerateNameCheck(name, &name_miss); |
1709 | 1709 |
1710 // Check that the maps starting from the prototype haven't changed. | 1710 // Check that the maps starting from the prototype haven't changed. |
1711 GenerateDirectLoadGlobalFunctionPrototype(masm(), | 1711 GenerateDirectLoadGlobalFunctionPrototype(masm(), |
1712 Context::STRING_FUNCTION_INDEX, | 1712 Context::STRING_FUNCTION_INDEX, |
1713 eax, | 1713 eax, |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1779 } | 1779 } |
1780 | 1780 |
1781 const int argc = arguments().immediate(); | 1781 const int argc = arguments().immediate(); |
1782 | 1782 |
1783 Label miss; | 1783 Label miss; |
1784 Label name_miss; | 1784 Label name_miss; |
1785 Label index_out_of_range; | 1785 Label index_out_of_range; |
1786 Label* index_out_of_range_label = &index_out_of_range; | 1786 Label* index_out_of_range_label = &index_out_of_range; |
1787 | 1787 |
1788 if (kind_ == Code::CALL_IC && | 1788 if (kind_ == Code::CALL_IC && |
1789 (CallICBase::StringStubState::decode(extra_ic_state_) == | 1789 (CallICBase::StringStubState::decode(extra_state_) == |
1790 DEFAULT_STRING_STUB)) { | 1790 DEFAULT_STRING_STUB)) { |
1791 index_out_of_range_label = &miss; | 1791 index_out_of_range_label = &miss; |
1792 } | 1792 } |
1793 | 1793 |
1794 GenerateNameCheck(name, &name_miss); | 1794 GenerateNameCheck(name, &name_miss); |
1795 | 1795 |
1796 // Check that the maps starting from the prototype haven't changed. | 1796 // Check that the maps starting from the prototype haven't changed. |
1797 GenerateDirectLoadGlobalFunctionPrototype(masm(), | 1797 GenerateDirectLoadGlobalFunctionPrototype(masm(), |
1798 Context::STRING_FUNCTION_INDEX, | 1798 Context::STRING_FUNCTION_INDEX, |
1799 eax, | 1799 eax, |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1901 StringCharFromCodeGenerator char_from_code_generator(code, eax); | 1901 StringCharFromCodeGenerator char_from_code_generator(code, eax); |
1902 char_from_code_generator.GenerateFast(masm()); | 1902 char_from_code_generator.GenerateFast(masm()); |
1903 __ ret(2 * kPointerSize); | 1903 __ ret(2 * kPointerSize); |
1904 | 1904 |
1905 StubRuntimeCallHelper call_helper; | 1905 StubRuntimeCallHelper call_helper; |
1906 char_from_code_generator.GenerateSlow(masm(), call_helper); | 1906 char_from_code_generator.GenerateSlow(masm(), call_helper); |
1907 | 1907 |
1908 // Tail call the full function. We do not have to patch the receiver | 1908 // Tail call the full function. We do not have to patch the receiver |
1909 // because the function makes no use of it. | 1909 // because the function makes no use of it. |
1910 __ bind(&slow); | 1910 __ bind(&slow); |
1911 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 1911 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
1912 ? CALL_AS_FUNCTION | 1912 ? CALL_AS_FUNCTION |
1913 : CALL_AS_METHOD; | 1913 : CALL_AS_METHOD; |
1914 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, | 1914 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, |
1915 NullCallWrapper(), call_kind); | 1915 NullCallWrapper(), call_kind); |
1916 | 1916 |
1917 __ bind(&miss); | 1917 __ bind(&miss); |
1918 // ecx: function name. | 1918 // ecx: function name. |
1919 MaybeObject* maybe_result = GenerateMissBranch(); | 1919 MaybeObject* maybe_result = GenerateMissBranch(); |
1920 if (maybe_result->IsFailure()) return maybe_result; | 1920 if (maybe_result->IsFailure()) return maybe_result; |
1921 | 1921 |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2332 CheckPrototypes(JSObject::cast(object->GetPrototype()), eax, holder, | 2332 CheckPrototypes(JSObject::cast(object->GetPrototype()), eax, holder, |
2333 ebx, edx, edi, name, &miss); | 2333 ebx, edx, edi, name, &miss); |
2334 } | 2334 } |
2335 break; | 2335 break; |
2336 } | 2336 } |
2337 | 2337 |
2338 default: | 2338 default: |
2339 UNREACHABLE(); | 2339 UNREACHABLE(); |
2340 } | 2340 } |
2341 | 2341 |
2342 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2342 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
2343 ? CALL_AS_FUNCTION | 2343 ? CALL_AS_FUNCTION |
2344 : CALL_AS_METHOD; | 2344 : CALL_AS_METHOD; |
2345 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, | 2345 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, |
2346 NullCallWrapper(), call_kind); | 2346 NullCallWrapper(), call_kind); |
2347 | 2347 |
2348 // Handle call cache miss. | 2348 // Handle call cache miss. |
2349 __ bind(&miss); | 2349 __ bind(&miss); |
2350 MaybeObject* maybe_result = GenerateMissBranch(); | 2350 MaybeObject* maybe_result = GenerateMissBranch(); |
2351 if (maybe_result->IsFailure()) return maybe_result; | 2351 if (maybe_result->IsFailure()) return maybe_result; |
2352 | 2352 |
(...skipping 18 matching lines...) Expand all Loading... |
2371 | 2371 |
2372 // Get the number of arguments. | 2372 // Get the number of arguments. |
2373 const int argc = arguments().immediate(); | 2373 const int argc = arguments().immediate(); |
2374 | 2374 |
2375 LookupResult lookup(isolate()); | 2375 LookupResult lookup(isolate()); |
2376 LookupPostInterceptor(holder, name, &lookup); | 2376 LookupPostInterceptor(holder, name, &lookup); |
2377 | 2377 |
2378 // Get the receiver from the stack. | 2378 // Get the receiver from the stack. |
2379 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2379 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
2380 | 2380 |
2381 CallInterceptorCompiler compiler(this, arguments(), ecx, extra_ic_state_); | 2381 CallInterceptorCompiler compiler(this, arguments(), ecx, extra_state_); |
2382 MaybeObject* result = compiler.Compile(masm(), | 2382 MaybeObject* result = compiler.Compile(masm(), |
2383 object, | 2383 object, |
2384 holder, | 2384 holder, |
2385 name, | 2385 name, |
2386 &lookup, | 2386 &lookup, |
2387 edx, | 2387 edx, |
2388 ebx, | 2388 ebx, |
2389 edi, | 2389 edi, |
2390 eax, | 2390 eax, |
2391 &miss); | 2391 &miss); |
2392 if (result->IsFailure()) return result; | 2392 if (result->IsFailure()) return result; |
2393 | 2393 |
2394 // Restore receiver. | 2394 // Restore receiver. |
2395 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2395 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
2396 | 2396 |
2397 // Check that the function really is a function. | 2397 // Check that the function really is a function. |
2398 __ JumpIfSmi(eax, &miss); | 2398 __ JumpIfSmi(eax, &miss); |
2399 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); | 2399 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); |
2400 __ j(not_equal, &miss); | 2400 __ j(not_equal, &miss); |
2401 | 2401 |
2402 // Patch the receiver on the stack with the global proxy if | 2402 // Patch the receiver on the stack with the global proxy if |
2403 // necessary. | 2403 // necessary. |
2404 if (object->IsGlobalObject()) { | 2404 if (object->IsGlobalObject()) { |
2405 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 2405 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
2406 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 2406 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
2407 } | 2407 } |
2408 | 2408 |
2409 // Invoke the function. | 2409 // Invoke the function. |
2410 __ mov(edi, eax); | 2410 __ mov(edi, eax); |
2411 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2411 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
2412 ? CALL_AS_FUNCTION | 2412 ? CALL_AS_FUNCTION |
2413 : CALL_AS_METHOD; | 2413 : CALL_AS_METHOD; |
2414 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, | 2414 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, |
2415 NullCallWrapper(), call_kind); | 2415 NullCallWrapper(), call_kind); |
2416 | 2416 |
2417 // Handle load cache miss. | 2417 // Handle load cache miss. |
2418 __ bind(&miss); | 2418 __ bind(&miss); |
2419 MaybeObject* maybe_result = GenerateMissBranch(); | 2419 MaybeObject* maybe_result = GenerateMissBranch(); |
2420 if (maybe_result->IsFailure()) return maybe_result; | 2420 if (maybe_result->IsFailure()) return maybe_result; |
2421 | 2421 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2463 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 2463 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
2464 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 2464 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
2465 } | 2465 } |
2466 | 2466 |
2467 // Setup the context (function already in edi). | 2467 // Setup the context (function already in edi). |
2468 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 2468 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
2469 | 2469 |
2470 // Jump to the cached code (tail call). | 2470 // Jump to the cached code (tail call). |
2471 Counters* counters = isolate()->counters(); | 2471 Counters* counters = isolate()->counters(); |
2472 __ IncrementCounter(counters->call_global_inline(), 1); | 2472 __ IncrementCounter(counters->call_global_inline(), 1); |
2473 ASSERT(function->is_compiled()); | |
2474 ParameterCount expected(function->shared()->formal_parameter_count()); | 2473 ParameterCount expected(function->shared()->formal_parameter_count()); |
2475 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2474 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
2476 ? CALL_AS_FUNCTION | 2475 ? CALL_AS_FUNCTION |
2477 : CALL_AS_METHOD; | 2476 : CALL_AS_METHOD; |
2478 if (V8::UseCrankshaft()) { | 2477 // We call indirectly through the code field in the function to |
2479 // TODO(kasperl): For now, we always call indirectly through the | 2478 // allow recompilation to take effect without changing any of the |
2480 // code field in the function to allow recompilation to take effect | 2479 // call sites. |
2481 // without changing any of the call sites. | 2480 __ InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), |
2482 __ InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), | 2481 expected, arguments(), JUMP_FUNCTION, |
2483 expected, arguments(), JUMP_FUNCTION, | 2482 NullCallWrapper(), call_kind); |
2484 NullCallWrapper(), call_kind); | |
2485 } else { | |
2486 Handle<Code> code(function->code()); | |
2487 __ InvokeCode(code, expected, arguments(), | |
2488 RelocInfo::CODE_TARGET, JUMP_FUNCTION, | |
2489 NullCallWrapper(), call_kind); | |
2490 } | |
2491 | 2483 |
2492 // Handle call cache miss. | 2484 // Handle call cache miss. |
2493 __ bind(&miss); | 2485 __ bind(&miss); |
2494 __ IncrementCounter(counters->call_global_inline_miss(), 1); | 2486 __ IncrementCounter(counters->call_global_inline_miss(), 1); |
2495 MaybeObject* maybe_result = GenerateMissBranch(); | 2487 MaybeObject* maybe_result = GenerateMissBranch(); |
2496 if (maybe_result->IsFailure()) return maybe_result; | 2488 if (maybe_result->IsFailure()) return maybe_result; |
2497 | 2489 |
2498 // Return the generated code. | 2490 // Return the generated code. |
2499 return GetCode(NORMAL, name); | 2491 return GetCode(NORMAL, name); |
2500 } | 2492 } |
(...skipping 1525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4026 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 4018 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); |
4027 __ jmp(ic_miss, RelocInfo::CODE_TARGET); | 4019 __ jmp(ic_miss, RelocInfo::CODE_TARGET); |
4028 } | 4020 } |
4029 | 4021 |
4030 | 4022 |
4031 #undef __ | 4023 #undef __ |
4032 | 4024 |
4033 } } // namespace v8::internal | 4025 } } // namespace v8::internal |
4034 | 4026 |
4035 #endif // V8_TARGET_ARCH_IA32 | 4027 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |