| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 944 ASSERT(depth2 == kInvalidProtoDepth); | 944 ASSERT(depth2 == kInvalidProtoDepth); |
| 945 } | 945 } |
| 946 | 946 |
| 947 // Invoke function. | 947 // Invoke function. |
| 948 if (can_do_fast_api_call) { | 948 if (can_do_fast_api_call) { |
| 949 GenerateFastApiDirectCall(masm, optimization, arguments_.immediate()); | 949 GenerateFastApiDirectCall(masm, optimization, arguments_.immediate()); |
| 950 } else { | 950 } else { |
| 951 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 951 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
| 952 ? CALL_AS_FUNCTION | 952 ? CALL_AS_FUNCTION |
| 953 : CALL_AS_METHOD; | 953 : CALL_AS_METHOD; |
| 954 __ InvokeFunction(optimization.constant_function(), arguments_, | 954 Handle<JSFunction> function = optimization.constant_function(); |
| 955 ParameterCount expected(function); |
| 956 __ InvokeFunction(function, expected, arguments_, |
| 955 JUMP_FUNCTION, NullCallWrapper(), call_kind); | 957 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
| 956 } | 958 } |
| 957 | 959 |
| 958 // Deferred code for fast API call case---clean preallocated space. | 960 // Deferred code for fast API call case---clean preallocated space. |
| 959 if (can_do_fast_api_call) { | 961 if (can_do_fast_api_call) { |
| 960 __ bind(&miss_cleanup); | 962 __ bind(&miss_cleanup); |
| 961 FreeSpaceForFastApiCall(masm); | 963 FreeSpaceForFastApiCall(masm); |
| 962 __ Branch(miss_label); | 964 __ Branch(miss_label); |
| 963 } | 965 } |
| 964 | 966 |
| (...skipping 1119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2084 generator.GenerateFast(masm()); | 2086 generator.GenerateFast(masm()); |
| 2085 __ Drop(argc + 1); | 2087 __ Drop(argc + 1); |
| 2086 __ Ret(); | 2088 __ Ret(); |
| 2087 | 2089 |
| 2088 StubRuntimeCallHelper call_helper; | 2090 StubRuntimeCallHelper call_helper; |
| 2089 generator.GenerateSlow(masm(), call_helper); | 2091 generator.GenerateSlow(masm(), call_helper); |
| 2090 | 2092 |
| 2091 // Tail call the full function. We do not have to patch the receiver | 2093 // Tail call the full function. We do not have to patch the receiver |
| 2092 // because the function makes no use of it. | 2094 // because the function makes no use of it. |
| 2093 __ bind(&slow); | 2095 __ bind(&slow); |
| 2094 __ InvokeFunction( | 2096 ParameterCount expected(function); |
| 2095 function, arguments(), JUMP_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); | 2097 __ InvokeFunction(function, expected, arguments(), |
| 2098 JUMP_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); |
| 2096 | 2099 |
| 2097 __ bind(&miss); | 2100 __ bind(&miss); |
| 2098 // a2: function name. | 2101 // a2: function name. |
| 2099 GenerateMissBranch(); | 2102 GenerateMissBranch(); |
| 2100 | 2103 |
| 2101 // Return the generated code. | 2104 // Return the generated code. |
| 2102 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2105 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
| 2103 } | 2106 } |
| 2104 | 2107 |
| 2105 | 2108 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2214 __ Drop(argc + 1); | 2217 __ Drop(argc + 1); |
| 2215 __ Ret(); | 2218 __ Ret(); |
| 2216 | 2219 |
| 2217 __ bind(&wont_fit_smi); | 2220 __ bind(&wont_fit_smi); |
| 2218 // Restore FCSR and fall to slow case. | 2221 // Restore FCSR and fall to slow case. |
| 2219 __ ctc1(a3, FCSR); | 2222 __ ctc1(a3, FCSR); |
| 2220 | 2223 |
| 2221 __ bind(&slow); | 2224 __ bind(&slow); |
| 2222 // Tail call the full function. We do not have to patch the receiver | 2225 // Tail call the full function. We do not have to patch the receiver |
| 2223 // because the function makes no use of it. | 2226 // because the function makes no use of it. |
| 2224 __ InvokeFunction( | 2227 ParameterCount expected(function); |
| 2225 function, arguments(), JUMP_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); | 2228 __ InvokeFunction(function, expected, arguments(), |
| 2229 JUMP_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); |
| 2226 | 2230 |
| 2227 __ bind(&miss); | 2231 __ bind(&miss); |
| 2228 // a2: function name. | 2232 // a2: function name. |
| 2229 GenerateMissBranch(); | 2233 GenerateMissBranch(); |
| 2230 | 2234 |
| 2231 // Return the generated code. | 2235 // Return the generated code. |
| 2232 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2236 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
| 2233 } | 2237 } |
| 2234 | 2238 |
| 2235 | 2239 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2315 __ LoadRoot(t2, Heap::kHeapNumberMapRootIndex); | 2319 __ LoadRoot(t2, Heap::kHeapNumberMapRootIndex); |
| 2316 __ AllocateHeapNumber(v0, t0, t1, t2, &slow); | 2320 __ AllocateHeapNumber(v0, t0, t1, t2, &slow); |
| 2317 __ sw(a1, FieldMemOperand(v0, HeapNumber::kExponentOffset)); | 2321 __ sw(a1, FieldMemOperand(v0, HeapNumber::kExponentOffset)); |
| 2318 __ sw(a3, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); | 2322 __ sw(a3, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); |
| 2319 __ Drop(argc + 1); | 2323 __ Drop(argc + 1); |
| 2320 __ Ret(); | 2324 __ Ret(); |
| 2321 | 2325 |
| 2322 // Tail call the full function. We do not have to patch the receiver | 2326 // Tail call the full function. We do not have to patch the receiver |
| 2323 // because the function makes no use of it. | 2327 // because the function makes no use of it. |
| 2324 __ bind(&slow); | 2328 __ bind(&slow); |
| 2325 __ InvokeFunction( | 2329 ParameterCount expected(function); |
| 2326 function, arguments(), JUMP_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); | 2330 __ InvokeFunction(function, expected, arguments(), |
| 2331 JUMP_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); |
| 2327 | 2332 |
| 2328 __ bind(&miss); | 2333 __ bind(&miss); |
| 2329 // a2: function name. | 2334 // a2: function name. |
| 2330 GenerateMissBranch(); | 2335 GenerateMissBranch(); |
| 2331 | 2336 |
| 2332 // Return the generated code. | 2337 // Return the generated code. |
| 2333 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2338 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
| 2334 } | 2339 } |
| 2335 | 2340 |
| 2336 | 2341 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2491 __ bind(&miss); | 2496 __ bind(&miss); |
| 2492 | 2497 |
| 2493 GenerateMissBranch(); | 2498 GenerateMissBranch(); |
| 2494 } | 2499 } |
| 2495 | 2500 |
| 2496 | 2501 |
| 2497 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { | 2502 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { |
| 2498 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) | 2503 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 2499 ? CALL_AS_FUNCTION | 2504 ? CALL_AS_FUNCTION |
| 2500 : CALL_AS_METHOD; | 2505 : CALL_AS_METHOD; |
| 2501 __ InvokeFunction( | 2506 ParameterCount expected(function); |
| 2502 function, arguments(), JUMP_FUNCTION, NullCallWrapper(), call_kind); | 2507 __ InvokeFunction(function, expected, arguments(), |
| 2508 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
| 2503 } | 2509 } |
| 2504 | 2510 |
| 2505 | 2511 |
| 2506 Handle<Code> CallStubCompiler::CompileCallConstant( | 2512 Handle<Code> CallStubCompiler::CompileCallConstant( |
| 2507 Handle<Object> object, | 2513 Handle<Object> object, |
| 2508 Handle<JSObject> holder, | 2514 Handle<JSObject> holder, |
| 2509 Handle<Name> name, | 2515 Handle<Name> name, |
| 2510 CheckType check, | 2516 CheckType check, |
| 2511 Handle<JSFunction> function) { | 2517 Handle<JSFunction> function) { |
| 2512 if (HasCustomCallGenerator(function)) { | 2518 if (HasCustomCallGenerator(function)) { |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2679 FrameScope scope(masm, StackFrame::INTERNAL); | 2685 FrameScope scope(masm, StackFrame::INTERNAL); |
| 2680 | 2686 |
| 2681 // Save value register, so we can restore it later. | 2687 // Save value register, so we can restore it later. |
| 2682 __ push(a0); | 2688 __ push(a0); |
| 2683 | 2689 |
| 2684 if (!setter.is_null()) { | 2690 if (!setter.is_null()) { |
| 2685 // Call the JavaScript setter with receiver and value on the stack. | 2691 // Call the JavaScript setter with receiver and value on the stack. |
| 2686 __ push(a1); | 2692 __ push(a1); |
| 2687 __ push(a0); | 2693 __ push(a0); |
| 2688 ParameterCount actual(1); | 2694 ParameterCount actual(1); |
| 2689 __ InvokeFunction(setter, actual, CALL_FUNCTION, NullCallWrapper(), | 2695 ParameterCount expected(setter); |
| 2690 CALL_AS_METHOD); | 2696 __ InvokeFunction(setter, expected, actual, |
| 2697 CALL_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); |
| 2691 } else { | 2698 } else { |
| 2692 // If we generate a global code snippet for deoptimization only, remember | 2699 // If we generate a global code snippet for deoptimization only, remember |
| 2693 // the place to continue after deoptimization. | 2700 // the place to continue after deoptimization. |
| 2694 masm->isolate()->heap()->SetSetterStubDeoptPCOffset(masm->pc_offset()); | 2701 masm->isolate()->heap()->SetSetterStubDeoptPCOffset(masm->pc_offset()); |
| 2695 } | 2702 } |
| 2696 | 2703 |
| 2697 // We have to return the passed value, not the return value of the setter. | 2704 // We have to return the passed value, not the return value of the setter. |
| 2698 __ pop(v0); | 2705 __ pop(v0); |
| 2699 | 2706 |
| 2700 // Restore context register. | 2707 // Restore context register. |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2860 // -- a2 : name | 2867 // -- a2 : name |
| 2861 // -- ra : return address | 2868 // -- ra : return address |
| 2862 // ----------------------------------- | 2869 // ----------------------------------- |
| 2863 { | 2870 { |
| 2864 FrameScope scope(masm, StackFrame::INTERNAL); | 2871 FrameScope scope(masm, StackFrame::INTERNAL); |
| 2865 | 2872 |
| 2866 if (!getter.is_null()) { | 2873 if (!getter.is_null()) { |
| 2867 // Call the JavaScript getter with the receiver on the stack. | 2874 // Call the JavaScript getter with the receiver on the stack. |
| 2868 __ push(a0); | 2875 __ push(a0); |
| 2869 ParameterCount actual(0); | 2876 ParameterCount actual(0); |
| 2870 __ InvokeFunction(getter, actual, CALL_FUNCTION, NullCallWrapper(), | 2877 ParameterCount expected(getter); |
| 2871 CALL_AS_METHOD); | 2878 __ InvokeFunction(getter, expected, actual, |
| 2879 CALL_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); |
| 2872 } else { | 2880 } else { |
| 2873 // If we generate a global code snippet for deoptimization only, remember | 2881 // If we generate a global code snippet for deoptimization only, remember |
| 2874 // the place to continue after deoptimization. | 2882 // the place to continue after deoptimization. |
| 2875 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset()); | 2883 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset()); |
| 2876 } | 2884 } |
| 2877 | 2885 |
| 2878 // Restore context register. | 2886 // Restore context register. |
| 2879 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2887 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 2880 } | 2888 } |
| 2881 __ Ret(); | 2889 __ Ret(); |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3745 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 3753 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |
| 3746 } | 3754 } |
| 3747 } | 3755 } |
| 3748 | 3756 |
| 3749 | 3757 |
| 3750 #undef __ | 3758 #undef __ |
| 3751 | 3759 |
| 3752 } } // namespace v8::internal | 3760 } } // namespace v8::internal |
| 3753 | 3761 |
| 3754 #endif // V8_TARGET_ARCH_MIPS | 3762 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |