| 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 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 } | 465 } |
| 466 | 466 |
| 467 Handle<Code> ic(code); | 467 Handle<Code> ic(code); |
| 468 __ Jump(ic, RelocInfo::CODE_TARGET); | 468 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 469 } | 469 } |
| 470 | 470 |
| 471 | 471 |
| 472 static void GenerateCallFunction(MacroAssembler* masm, | 472 static void GenerateCallFunction(MacroAssembler* masm, |
| 473 Object* object, | 473 Object* object, |
| 474 const ParameterCount& arguments, | 474 const ParameterCount& arguments, |
| 475 Label* miss) { | 475 Label* miss, |
| 476 Code::ExtraICState extra_ic_state) { |
| 476 // ----------- S t a t e ------------- | 477 // ----------- S t a t e ------------- |
| 477 // -- a0: receiver | 478 // -- a0: receiver |
| 478 // -- a1: function to call | 479 // -- a1: function to call |
| 479 // ----------------------------------- | 480 // ----------------------------------- |
| 480 // Check that the function really is a function. | 481 // Check that the function really is a function. |
| 481 __ JumpIfSmi(a1, miss); | 482 __ JumpIfSmi(a1, miss); |
| 482 __ GetObjectType(a1, a3, a3); | 483 __ GetObjectType(a1, a3, a3); |
| 483 __ Branch(miss, ne, a3, Operand(JS_FUNCTION_TYPE)); | 484 __ Branch(miss, ne, a3, Operand(JS_FUNCTION_TYPE)); |
| 484 | 485 |
| 485 // Patch the receiver on the stack with the global proxy if | 486 // Patch the receiver on the stack with the global proxy if |
| 486 // necessary. | 487 // necessary. |
| 487 if (object->IsGlobalObject()) { | 488 if (object->IsGlobalObject()) { |
| 488 __ lw(a3, FieldMemOperand(a0, GlobalObject::kGlobalReceiverOffset)); | 489 __ lw(a3, FieldMemOperand(a0, GlobalObject::kGlobalReceiverOffset)); |
| 489 __ sw(a3, MemOperand(sp, arguments.immediate() * kPointerSize)); | 490 __ sw(a3, MemOperand(sp, arguments.immediate() * kPointerSize)); |
| 490 } | 491 } |
| 491 | 492 |
| 492 // Invoke the function. | 493 // Invoke the function. |
| 493 __ InvokeFunction(a1, arguments, JUMP_FUNCTION); | 494 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state) |
| 495 ? CALL_AS_FUNCTION |
| 496 : CALL_AS_METHOD; |
| 497 __ InvokeFunction(a1, arguments, JUMP_FUNCTION, NullCallWrapper(), call_kind); |
| 494 } | 498 } |
| 495 | 499 |
| 496 | 500 |
| 497 static void PushInterceptorArguments(MacroAssembler* masm, | 501 static void PushInterceptorArguments(MacroAssembler* masm, |
| 498 Register receiver, | 502 Register receiver, |
| 499 Register holder, | 503 Register holder, |
| 500 Register name, | 504 Register name, |
| 501 JSObject* holder_obj) { | 505 JSObject* holder_obj) { |
| 502 __ push(name); | 506 __ push(name); |
| 503 InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor(); | 507 InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor(); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 ExternalReference(&fun, | 626 ExternalReference(&fun, |
| 623 ExternalReference::DIRECT_API_CALL, | 627 ExternalReference::DIRECT_API_CALL, |
| 624 masm->isolate()); | 628 masm->isolate()); |
| 625 return masm->TryCallApiFunctionAndReturn(ref, kStackUnwindSpace); | 629 return masm->TryCallApiFunctionAndReturn(ref, kStackUnwindSpace); |
| 626 } | 630 } |
| 627 | 631 |
| 628 class CallInterceptorCompiler BASE_EMBEDDED { | 632 class CallInterceptorCompiler BASE_EMBEDDED { |
| 629 public: | 633 public: |
| 630 CallInterceptorCompiler(StubCompiler* stub_compiler, | 634 CallInterceptorCompiler(StubCompiler* stub_compiler, |
| 631 const ParameterCount& arguments, | 635 const ParameterCount& arguments, |
| 632 Register name) | 636 Register name, |
| 637 Code::ExtraICState extra_ic_state) |
| 633 : stub_compiler_(stub_compiler), | 638 : stub_compiler_(stub_compiler), |
| 634 arguments_(arguments), | 639 arguments_(arguments), |
| 635 name_(name) {} | 640 name_(name), |
| 641 extra_ic_state_(extra_ic_state) {} |
| 636 | 642 |
| 637 MaybeObject* Compile(MacroAssembler* masm, | 643 MaybeObject* Compile(MacroAssembler* masm, |
| 638 JSObject* object, | 644 JSObject* object, |
| 639 JSObject* holder, | 645 JSObject* holder, |
| 640 String* name, | 646 String* name, |
| 641 LookupResult* lookup, | 647 LookupResult* lookup, |
| 642 Register receiver, | 648 Register receiver, |
| 643 Register scratch1, | 649 Register scratch1, |
| 644 Register scratch2, | 650 Register scratch2, |
| 645 Register scratch3, | 651 Register scratch3, |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 ASSERT(depth2 == kInvalidProtoDepth); | 759 ASSERT(depth2 == kInvalidProtoDepth); |
| 754 } | 760 } |
| 755 | 761 |
| 756 // Invoke function. | 762 // Invoke function. |
| 757 if (can_do_fast_api_call) { | 763 if (can_do_fast_api_call) { |
| 758 MaybeObject* result = GenerateFastApiDirectCall(masm, | 764 MaybeObject* result = GenerateFastApiDirectCall(masm, |
| 759 optimization, | 765 optimization, |
| 760 arguments_.immediate()); | 766 arguments_.immediate()); |
| 761 if (result->IsFailure()) return result; | 767 if (result->IsFailure()) return result; |
| 762 } else { | 768 } else { |
| 769 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
| 770 ? CALL_AS_FUNCTION |
| 771 : CALL_AS_METHOD; |
| 763 __ InvokeFunction(optimization.constant_function(), arguments_, | 772 __ InvokeFunction(optimization.constant_function(), arguments_, |
| 764 JUMP_FUNCTION); | 773 JUMP_FUNCTION, call_kind); |
| 765 } | 774 } |
| 766 | 775 |
| 767 // Deferred code for fast API call case---clean preallocated space. | 776 // Deferred code for fast API call case---clean preallocated space. |
| 768 if (can_do_fast_api_call) { | 777 if (can_do_fast_api_call) { |
| 769 __ bind(&miss_cleanup); | 778 __ bind(&miss_cleanup); |
| 770 FreeSpaceForFastApiCall(masm); | 779 FreeSpaceForFastApiCall(masm); |
| 771 __ Branch(miss_label); | 780 __ Branch(miss_label); |
| 772 } | 781 } |
| 773 | 782 |
| 774 // Invoke a regular function. | 783 // Invoke a regular function. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 __ LeaveInternalFrame(); | 846 __ LeaveInternalFrame(); |
| 838 | 847 |
| 839 // If interceptor returns no-result sentinel, call the constant function. | 848 // If interceptor returns no-result sentinel, call the constant function. |
| 840 __ LoadRoot(scratch, Heap::kNoInterceptorResultSentinelRootIndex); | 849 __ LoadRoot(scratch, Heap::kNoInterceptorResultSentinelRootIndex); |
| 841 __ Branch(interceptor_succeeded, ne, v0, Operand(scratch)); | 850 __ Branch(interceptor_succeeded, ne, v0, Operand(scratch)); |
| 842 } | 851 } |
| 843 | 852 |
| 844 StubCompiler* stub_compiler_; | 853 StubCompiler* stub_compiler_; |
| 845 const ParameterCount& arguments_; | 854 const ParameterCount& arguments_; |
| 846 Register name_; | 855 Register name_; |
| 856 Code::ExtraICState extra_ic_state_; |
| 847 }; | 857 }; |
| 848 | 858 |
| 849 | 859 |
| 850 | 860 |
| 851 // Generate code to check that a global property cell is empty. Create | 861 // Generate code to check that a global property cell is empty. Create |
| 852 // the property cell at compilation time if no cell exists for the | 862 // the property cell at compilation time if no cell exists for the |
| 853 // property. | 863 // property. |
| 854 MUST_USE_RESULT static MaybeObject* GenerateCheckPropertyCell( | 864 MUST_USE_RESULT static MaybeObject* GenerateCheckPropertyCell( |
| 855 MacroAssembler* masm, | 865 MacroAssembler* masm, |
| 856 GlobalObject* global, | 866 GlobalObject* global, |
| (...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 | 1506 |
| 1497 // Get the receiver of the function from the stack into a0. | 1507 // Get the receiver of the function from the stack into a0. |
| 1498 __ lw(a0, MemOperand(sp, argc * kPointerSize)); | 1508 __ lw(a0, MemOperand(sp, argc * kPointerSize)); |
| 1499 // Check that the receiver isn't a smi. | 1509 // Check that the receiver isn't a smi. |
| 1500 __ JumpIfSmi(a0, &miss, t0); | 1510 __ JumpIfSmi(a0, &miss, t0); |
| 1501 | 1511 |
| 1502 // Do the right check and compute the holder register. | 1512 // Do the right check and compute the holder register. |
| 1503 Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss); | 1513 Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss); |
| 1504 GenerateFastPropertyLoad(masm(), a1, reg, holder, index); | 1514 GenerateFastPropertyLoad(masm(), a1, reg, holder, index); |
| 1505 | 1515 |
| 1506 GenerateCallFunction(masm(), object, arguments(), &miss); | 1516 GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_); |
| 1507 | 1517 |
| 1508 // Handle call cache miss. | 1518 // Handle call cache miss. |
| 1509 __ bind(&miss); | 1519 __ bind(&miss); |
| 1510 MaybeObject* maybe_result = GenerateMissBranch(); | 1520 MaybeObject* maybe_result = GenerateMissBranch(); |
| 1511 if (maybe_result->IsFailure()) return maybe_result; | 1521 if (maybe_result->IsFailure()) return maybe_result; |
| 1512 | 1522 |
| 1513 // Return the generated code. | 1523 // Return the generated code. |
| 1514 return GetCode(FIELD, name); | 1524 return GetCode(FIELD, name); |
| 1515 } | 1525 } |
| 1516 | 1526 |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 char_from_code_generator.GenerateFast(masm()); | 2004 char_from_code_generator.GenerateFast(masm()); |
| 1995 __ Drop(argc + 1); | 2005 __ Drop(argc + 1); |
| 1996 __ Ret(); | 2006 __ Ret(); |
| 1997 | 2007 |
| 1998 StubRuntimeCallHelper call_helper; | 2008 StubRuntimeCallHelper call_helper; |
| 1999 char_from_code_generator.GenerateSlow(masm(), call_helper); | 2009 char_from_code_generator.GenerateSlow(masm(), call_helper); |
| 2000 | 2010 |
| 2001 // Tail call the full function. We do not have to patch the receiver | 2011 // Tail call the full function. We do not have to patch the receiver |
| 2002 // because the function makes no use of it. | 2012 // because the function makes no use of it. |
| 2003 __ bind(&slow); | 2013 __ bind(&slow); |
| 2004 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2014 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD); |
| 2005 | 2015 |
| 2006 __ bind(&miss); | 2016 __ bind(&miss); |
| 2007 // a2: function name. | 2017 // a2: function name. |
| 2008 MaybeObject* maybe_result = GenerateMissBranch(); | 2018 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2009 if (maybe_result->IsFailure()) return maybe_result; | 2019 if (maybe_result->IsFailure()) return maybe_result; |
| 2010 | 2020 |
| 2011 // Return the generated code. | 2021 // Return the generated code. |
| 2012 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 2022 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
| 2013 } | 2023 } |
| 2014 | 2024 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2130 __ Drop(argc + 1); | 2140 __ Drop(argc + 1); |
| 2131 __ Ret(); | 2141 __ Ret(); |
| 2132 | 2142 |
| 2133 __ bind(&wont_fit_smi); | 2143 __ bind(&wont_fit_smi); |
| 2134 // Restore FCSR and fall to slow case. | 2144 // Restore FCSR and fall to slow case. |
| 2135 __ ctc1(a3, FCSR); | 2145 __ ctc1(a3, FCSR); |
| 2136 | 2146 |
| 2137 __ bind(&slow); | 2147 __ bind(&slow); |
| 2138 // Tail call the full function. We do not have to patch the receiver | 2148 // Tail call the full function. We do not have to patch the receiver |
| 2139 // because the function makes no use of it. | 2149 // because the function makes no use of it. |
| 2140 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2150 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD); |
| 2141 | 2151 |
| 2142 __ bind(&miss); | 2152 __ bind(&miss); |
| 2143 // a2: function name. | 2153 // a2: function name. |
| 2144 MaybeObject* obj = GenerateMissBranch(); | 2154 MaybeObject* obj = GenerateMissBranch(); |
| 2145 if (obj->IsFailure()) return obj; | 2155 if (obj->IsFailure()) return obj; |
| 2146 | 2156 |
| 2147 // Return the generated code. | 2157 // Return the generated code. |
| 2148 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 2158 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
| 2149 } | 2159 } |
| 2150 | 2160 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2232 __ LoadRoot(t2, Heap::kHeapNumberMapRootIndex); | 2242 __ LoadRoot(t2, Heap::kHeapNumberMapRootIndex); |
| 2233 __ AllocateHeapNumber(v0, t0, t1, t2, &slow); | 2243 __ AllocateHeapNumber(v0, t0, t1, t2, &slow); |
| 2234 __ sw(a1, FieldMemOperand(v0, HeapNumber::kExponentOffset)); | 2244 __ sw(a1, FieldMemOperand(v0, HeapNumber::kExponentOffset)); |
| 2235 __ sw(a3, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); | 2245 __ sw(a3, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); |
| 2236 __ Drop(argc + 1); | 2246 __ Drop(argc + 1); |
| 2237 __ Ret(); | 2247 __ Ret(); |
| 2238 | 2248 |
| 2239 // Tail call the full function. We do not have to patch the receiver | 2249 // Tail call the full function. We do not have to patch the receiver |
| 2240 // because the function makes no use of it. | 2250 // because the function makes no use of it. |
| 2241 __ bind(&slow); | 2251 __ bind(&slow); |
| 2242 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2252 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD); |
| 2243 | 2253 |
| 2244 __ bind(&miss); | 2254 __ bind(&miss); |
| 2245 // a2: function name. | 2255 // a2: function name. |
| 2246 MaybeObject* maybe_result = GenerateMissBranch(); | 2256 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2247 if (maybe_result->IsFailure()) return maybe_result; | 2257 if (maybe_result->IsFailure()) return maybe_result; |
| 2248 | 2258 |
| 2249 // Return the generated code. | 2259 // Return the generated code. |
| 2250 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 2260 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
| 2251 } | 2261 } |
| 2252 | 2262 |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2418 CheckPrototypes(JSObject::cast(object->GetPrototype()), a0, holder, a3, | 2428 CheckPrototypes(JSObject::cast(object->GetPrototype()), a0, holder, a3, |
| 2419 a1, t0, name, &miss); | 2429 a1, t0, name, &miss); |
| 2420 } | 2430 } |
| 2421 break; | 2431 break; |
| 2422 } | 2432 } |
| 2423 | 2433 |
| 2424 default: | 2434 default: |
| 2425 UNREACHABLE(); | 2435 UNREACHABLE(); |
| 2426 } | 2436 } |
| 2427 | 2437 |
| 2428 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2438 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
| 2439 ? CALL_AS_FUNCTION |
| 2440 : CALL_AS_METHOD; |
| 2441 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind); |
| 2429 | 2442 |
| 2430 // Handle call cache miss. | 2443 // Handle call cache miss. |
| 2431 __ bind(&miss); | 2444 __ bind(&miss); |
| 2432 | 2445 |
| 2433 MaybeObject* maybe_result = GenerateMissBranch(); | 2446 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2434 if (maybe_result->IsFailure()) return maybe_result; | 2447 if (maybe_result->IsFailure()) return maybe_result; |
| 2435 | 2448 |
| 2436 // Return the generated code. | 2449 // Return the generated code. |
| 2437 return GetCode(function); | 2450 return GetCode(function); |
| 2438 } | 2451 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2452 | 2465 |
| 2453 // Get the number of arguments. | 2466 // Get the number of arguments. |
| 2454 const int argc = arguments().immediate(); | 2467 const int argc = arguments().immediate(); |
| 2455 | 2468 |
| 2456 LookupResult lookup; | 2469 LookupResult lookup; |
| 2457 LookupPostInterceptor(holder, name, &lookup); | 2470 LookupPostInterceptor(holder, name, &lookup); |
| 2458 | 2471 |
| 2459 // Get the receiver from the stack. | 2472 // Get the receiver from the stack. |
| 2460 __ lw(a1, MemOperand(sp, argc * kPointerSize)); | 2473 __ lw(a1, MemOperand(sp, argc * kPointerSize)); |
| 2461 | 2474 |
| 2462 CallInterceptorCompiler compiler(this, arguments(), a2); | 2475 CallInterceptorCompiler compiler(this, arguments(), a2, extra_ic_state_); |
| 2463 MaybeObject* result = compiler.Compile(masm(), | 2476 MaybeObject* result = compiler.Compile(masm(), |
| 2464 object, | 2477 object, |
| 2465 holder, | 2478 holder, |
| 2466 name, | 2479 name, |
| 2467 &lookup, | 2480 &lookup, |
| 2468 a1, | 2481 a1, |
| 2469 a3, | 2482 a3, |
| 2470 t0, | 2483 t0, |
| 2471 a0, | 2484 a0, |
| 2472 &miss); | 2485 &miss); |
| 2473 if (result->IsFailure()) { | 2486 if (result->IsFailure()) { |
| 2474 return result; | 2487 return result; |
| 2475 } | 2488 } |
| 2476 | 2489 |
| 2477 // Move returned value, the function to call, to a1. | 2490 // Move returned value, the function to call, to a1. |
| 2478 __ mov(a1, v0); | 2491 __ mov(a1, v0); |
| 2479 // Restore receiver. | 2492 // Restore receiver. |
| 2480 __ lw(a0, MemOperand(sp, argc * kPointerSize)); | 2493 __ lw(a0, MemOperand(sp, argc * kPointerSize)); |
| 2481 | 2494 |
| 2482 GenerateCallFunction(masm(), object, arguments(), &miss); | 2495 GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_); |
| 2483 | 2496 |
| 2484 // Handle call cache miss. | 2497 // Handle call cache miss. |
| 2485 __ bind(&miss); | 2498 __ bind(&miss); |
| 2486 MaybeObject* maybe_result = GenerateMissBranch(); | 2499 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2487 if (maybe_result->IsFailure()) return maybe_result; | 2500 if (maybe_result->IsFailure()) return maybe_result; |
| 2488 | 2501 |
| 2489 // Return the generated code. | 2502 // Return the generated code. |
| 2490 return GetCode(INTERCEPTOR, name); | 2503 return GetCode(INTERCEPTOR, name); |
| 2491 } | 2504 } |
| 2492 | 2505 |
| 2493 | 2506 |
| 2494 MaybeObject* CallStubCompiler::CompileCallGlobal( | 2507 MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object, |
| 2495 JSObject* object, | 2508 GlobalObject* holder, |
| 2496 GlobalObject* holder, | 2509 JSGlobalPropertyCell* cell, |
| 2497 JSGlobalPropertyCell* cell, | 2510 JSFunction* function, |
| 2498 JSFunction* function, | 2511 String* name) { |
| 2499 String* name, | |
| 2500 Code::ExtraICState extra_ic_state) { | |
| 2501 // ----------- S t a t e ------------- | 2512 // ----------- S t a t e ------------- |
| 2502 // -- a2 : name | 2513 // -- a2 : name |
| 2503 // -- ra : return address | 2514 // -- ra : return address |
| 2504 // ----------------------------------- | 2515 // ----------------------------------- |
| 2505 | 2516 |
| 2506 if (HasCustomCallGenerator(function)) { | 2517 if (HasCustomCallGenerator(function)) { |
| 2507 MaybeObject* maybe_result = CompileCustomCall( | 2518 MaybeObject* maybe_result = CompileCustomCall( |
| 2508 object, holder, cell, function, name); | 2519 object, holder, cell, function, name); |
| 2509 Object* result; | 2520 Object* result; |
| 2510 if (!maybe_result->ToObject(&result)) return maybe_result; | 2521 if (!maybe_result->ToObject(&result)) return maybe_result; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2531 | 2542 |
| 2532 // Setup the context (function already in r1). | 2543 // Setup the context (function already in r1). |
| 2533 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 2544 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
| 2534 | 2545 |
| 2535 // Jump to the cached code (tail call). | 2546 // Jump to the cached code (tail call). |
| 2536 Counters* counters = masm()->isolate()->counters(); | 2547 Counters* counters = masm()->isolate()->counters(); |
| 2537 __ IncrementCounter(counters->call_global_inline(), 1, a3, t0); | 2548 __ IncrementCounter(counters->call_global_inline(), 1, a3, t0); |
| 2538 ASSERT(function->is_compiled()); | 2549 ASSERT(function->is_compiled()); |
| 2539 Handle<Code> code(function->code()); | 2550 Handle<Code> code(function->code()); |
| 2540 ParameterCount expected(function->shared()->formal_parameter_count()); | 2551 ParameterCount expected(function->shared()->formal_parameter_count()); |
| 2541 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state) | 2552 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
| 2542 ? CALL_AS_FUNCTION | 2553 ? CALL_AS_FUNCTION |
| 2543 : CALL_AS_METHOD; | 2554 : CALL_AS_METHOD; |
| 2544 if (V8::UseCrankshaft()) { | 2555 if (V8::UseCrankshaft()) { |
| 2545 UNIMPLEMENTED_MIPS(); | 2556 UNIMPLEMENTED_MIPS(); |
| 2546 } else { | 2557 } else { |
| 2547 __ InvokeCode(code, expected, arguments(), RelocInfo::CODE_TARGET, | 2558 __ InvokeCode(code, expected, arguments(), RelocInfo::CODE_TARGET, |
| 2548 JUMP_FUNCTION, call_kind); | 2559 JUMP_FUNCTION, call_kind); |
| 2549 } | 2560 } |
| 2550 | 2561 |
| 2551 // Handle call cache miss. | 2562 // Handle call cache miss. |
| (...skipping 1724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4276 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 4287 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
| 4277 __ Jump(ic, RelocInfo::CODE_TARGET); | 4288 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 4278 } | 4289 } |
| 4279 | 4290 |
| 4280 | 4291 |
| 4281 #undef __ | 4292 #undef __ |
| 4282 | 4293 |
| 4283 } } // namespace v8::internal | 4294 } } // namespace v8::internal |
| 4284 | 4295 |
| 4285 #endif // V8_TARGET_ARCH_MIPS | 4296 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |