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 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 ASSERT(depth2 == kInvalidProtoDepth); | 614 ASSERT(depth2 == kInvalidProtoDepth); |
615 } | 615 } |
616 | 616 |
617 // Invoke function. | 617 // Invoke function. |
618 if (can_do_fast_api_call) { | 618 if (can_do_fast_api_call) { |
619 GenerateFastApiCall(masm, optimization, arguments_.immediate()); | 619 GenerateFastApiCall(masm, optimization, arguments_.immediate()); |
620 } else { | 620 } else { |
621 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 621 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
622 ? CALL_AS_FUNCTION | 622 ? CALL_AS_FUNCTION |
623 : CALL_AS_METHOD; | 623 : CALL_AS_METHOD; |
624 __ InvokeFunction(optimization.constant_function(), arguments_, | 624 Handle<JSFunction> fun = optimization.constant_function(); |
| 625 __ InvokeFunction(fun, ParameterCount(fun), arguments_, |
625 JUMP_FUNCTION, NullCallWrapper(), call_kind); | 626 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
626 } | 627 } |
627 | 628 |
628 // Deferred code for fast API call case---clean preallocated space. | 629 // Deferred code for fast API call case---clean preallocated space. |
629 if (can_do_fast_api_call) { | 630 if (can_do_fast_api_call) { |
630 __ bind(&miss_cleanup); | 631 __ bind(&miss_cleanup); |
631 FreeSpaceForFastApiCall(masm, scratch1); | 632 FreeSpaceForFastApiCall(masm, scratch1); |
632 __ jmp(miss_label); | 633 __ jmp(miss_label); |
633 } | 634 } |
634 | 635 |
(...skipping 1349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1984 | 1985 |
1985 StubRuntimeCallHelper call_helper; | 1986 StubRuntimeCallHelper call_helper; |
1986 generator.GenerateSlow(masm(), call_helper); | 1987 generator.GenerateSlow(masm(), call_helper); |
1987 | 1988 |
1988 // Tail call the full function. We do not have to patch the receiver | 1989 // Tail call the full function. We do not have to patch the receiver |
1989 // because the function makes no use of it. | 1990 // because the function makes no use of it. |
1990 __ bind(&slow); | 1991 __ bind(&slow); |
1991 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) | 1992 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
1992 ? CALL_AS_FUNCTION | 1993 ? CALL_AS_FUNCTION |
1993 : CALL_AS_METHOD; | 1994 : CALL_AS_METHOD; |
1994 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, | 1995 __ InvokeFunction(function, ParameterCount(function), arguments(), |
1995 NullCallWrapper(), call_kind); | 1996 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
1996 | 1997 |
1997 __ bind(&miss); | 1998 __ bind(&miss); |
1998 // rcx: function name. | 1999 // rcx: function name. |
1999 GenerateMissBranch(); | 2000 GenerateMissBranch(); |
2000 | 2001 |
2001 // Return the generated code. | 2002 // Return the generated code. |
2002 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2003 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
2003 } | 2004 } |
2004 | 2005 |
2005 | 2006 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2099 __ AllocateHeapNumber(rax, rdx, &slow); | 2100 __ AllocateHeapNumber(rax, rdx, &slow); |
2100 __ movq(FieldOperand(rax, HeapNumber::kValueOffset), rbx); | 2101 __ movq(FieldOperand(rax, HeapNumber::kValueOffset), rbx); |
2101 __ ret(2 * kPointerSize); | 2102 __ ret(2 * kPointerSize); |
2102 | 2103 |
2103 // Tail call the full function. We do not have to patch the receiver | 2104 // Tail call the full function. We do not have to patch the receiver |
2104 // because the function makes no use of it. | 2105 // because the function makes no use of it. |
2105 __ bind(&slow); | 2106 __ bind(&slow); |
2106 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) | 2107 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
2107 ? CALL_AS_FUNCTION | 2108 ? CALL_AS_FUNCTION |
2108 : CALL_AS_METHOD; | 2109 : CALL_AS_METHOD; |
2109 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, | 2110 __ InvokeFunction(function, ParameterCount(function), arguments(), |
2110 NullCallWrapper(), call_kind); | 2111 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
2111 | 2112 |
2112 __ bind(&miss); | 2113 __ bind(&miss); |
2113 // rcx: function name. | 2114 // rcx: function name. |
2114 GenerateMissBranch(); | 2115 GenerateMissBranch(); |
2115 | 2116 |
2116 // Return the generated code. | 2117 // Return the generated code. |
2117 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2118 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
2118 } | 2119 } |
2119 | 2120 |
2120 | 2121 |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2283 // Handle call cache miss. | 2284 // Handle call cache miss. |
2284 __ bind(&miss); | 2285 __ bind(&miss); |
2285 GenerateMissBranch(); | 2286 GenerateMissBranch(); |
2286 } | 2287 } |
2287 | 2288 |
2288 | 2289 |
2289 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { | 2290 void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) { |
2290 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) | 2291 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
2291 ? CALL_AS_FUNCTION | 2292 ? CALL_AS_FUNCTION |
2292 : CALL_AS_METHOD; | 2293 : CALL_AS_METHOD; |
2293 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, | 2294 __ InvokeFunction(function, ParameterCount(function), arguments(), |
2294 NullCallWrapper(), call_kind); | 2295 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
2295 } | 2296 } |
2296 | 2297 |
2297 | 2298 |
2298 Handle<Code> CallStubCompiler::CompileCallConstant( | 2299 Handle<Code> CallStubCompiler::CompileCallConstant( |
2299 Handle<Object> object, | 2300 Handle<Object> object, |
2300 Handle<JSObject> holder, | 2301 Handle<JSObject> holder, |
2301 Handle<Name> name, | 2302 Handle<Name> name, |
2302 CheckType check, | 2303 CheckType check, |
2303 Handle<JSFunction> function) { | 2304 Handle<JSFunction> function) { |
2304 if (HasCustomCallGenerator(function)) { | 2305 if (HasCustomCallGenerator(function)) { |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2496 FrameScope scope(masm, StackFrame::INTERNAL); | 2497 FrameScope scope(masm, StackFrame::INTERNAL); |
2497 | 2498 |
2498 // Save value register, so we can restore it later. | 2499 // Save value register, so we can restore it later. |
2499 __ push(rax); | 2500 __ push(rax); |
2500 | 2501 |
2501 if (!setter.is_null()) { | 2502 if (!setter.is_null()) { |
2502 // Call the JavaScript setter with receiver and value on the stack. | 2503 // Call the JavaScript setter with receiver and value on the stack. |
2503 __ push(rdx); | 2504 __ push(rdx); |
2504 __ push(rax); | 2505 __ push(rax); |
2505 ParameterCount actual(1); | 2506 ParameterCount actual(1); |
2506 __ InvokeFunction(setter, actual, CALL_FUNCTION, NullCallWrapper(), | 2507 ParameterCount expected(setter); |
2507 CALL_AS_METHOD); | 2508 __ InvokeFunction(setter, expected, actual, |
| 2509 CALL_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); |
2508 } else { | 2510 } else { |
2509 // If we generate a global code snippet for deoptimization only, remember | 2511 // If we generate a global code snippet for deoptimization only, remember |
2510 // the place to continue after deoptimization. | 2512 // the place to continue after deoptimization. |
2511 masm->isolate()->heap()->SetSetterStubDeoptPCOffset(masm->pc_offset()); | 2513 masm->isolate()->heap()->SetSetterStubDeoptPCOffset(masm->pc_offset()); |
2512 } | 2514 } |
2513 | 2515 |
2514 // We have to return the passed value, not the return value of the setter. | 2516 // We have to return the passed value, not the return value of the setter. |
2515 __ pop(rax); | 2517 __ pop(rax); |
2516 | 2518 |
2517 // Restore context register. | 2519 // Restore context register. |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2716 // -- rcx : name | 2718 // -- rcx : name |
2717 // -- rsp[0] : return address | 2719 // -- rsp[0] : return address |
2718 // ----------------------------------- | 2720 // ----------------------------------- |
2719 { | 2721 { |
2720 FrameScope scope(masm, StackFrame::INTERNAL); | 2722 FrameScope scope(masm, StackFrame::INTERNAL); |
2721 | 2723 |
2722 if (!getter.is_null()) { | 2724 if (!getter.is_null()) { |
2723 // Call the JavaScript getter with the receiver on the stack. | 2725 // Call the JavaScript getter with the receiver on the stack. |
2724 __ push(rax); | 2726 __ push(rax); |
2725 ParameterCount actual(0); | 2727 ParameterCount actual(0); |
2726 __ InvokeFunction(getter, actual, CALL_FUNCTION, NullCallWrapper(), | 2728 ParameterCount expected(getter); |
2727 CALL_AS_METHOD); | 2729 __ InvokeFunction(getter, expected, actual, |
| 2730 CALL_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); |
2728 } else { | 2731 } else { |
2729 // If we generate a global code snippet for deoptimization only, remember | 2732 // If we generate a global code snippet for deoptimization only, remember |
2730 // the place to continue after deoptimization. | 2733 // the place to continue after deoptimization. |
2731 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset()); | 2734 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset()); |
2732 } | 2735 } |
2733 | 2736 |
2734 // Restore context register. | 2737 // Restore context register. |
2735 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2738 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
2736 } | 2739 } |
2737 __ ret(0); | 2740 __ ret(0); |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3470 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 3473 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |
3471 } | 3474 } |
3472 } | 3475 } |
3473 | 3476 |
3474 | 3477 |
3475 #undef __ | 3478 #undef __ |
3476 | 3479 |
3477 } } // namespace v8::internal | 3480 } } // namespace v8::internal |
3478 | 3481 |
3479 #endif // V8_TARGET_ARCH_X64 | 3482 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |