| 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 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 const ExternalReference& ext, int result_size) { | 748 const ExternalReference& ext, int result_size) { |
| 749 // Set the entry point and jump to the C entry runtime stub. | 749 // Set the entry point and jump to the C entry runtime stub. |
| 750 LoadAddress(rbx, ext); | 750 LoadAddress(rbx, ext); |
| 751 CEntryStub ces(result_size); | 751 CEntryStub ces(result_size); |
| 752 return TryTailCallStub(&ces); | 752 return TryTailCallStub(&ces); |
| 753 } | 753 } |
| 754 | 754 |
| 755 | 755 |
| 756 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, | 756 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, |
| 757 InvokeFlag flag, | 757 InvokeFlag flag, |
| 758 CallWrapper* call_wrapper) { | 758 const CallWrapper& call_wrapper) { |
| 759 // Calls are not allowed in some stubs. | 759 // Calls are not allowed in some stubs. |
| 760 ASSERT(flag == JUMP_FUNCTION || allow_stub_calls()); | 760 ASSERT(flag == JUMP_FUNCTION || allow_stub_calls()); |
| 761 | 761 |
| 762 // Rely on the assertion to check that the number of provided | 762 // Rely on the assertion to check that the number of provided |
| 763 // arguments match the expected number of arguments. Fake a | 763 // arguments match the expected number of arguments. Fake a |
| 764 // parameter count to avoid emitting code to do the check. | 764 // parameter count to avoid emitting code to do the check. |
| 765 ParameterCount expected(0); | 765 ParameterCount expected(0); |
| 766 GetBuiltinEntry(rdx, id); | 766 GetBuiltinEntry(rdx, id); |
| 767 InvokeCode(rdx, expected, expected, flag, call_wrapper); | 767 InvokeCode(rdx, expected, expected, flag, call_wrapper); |
| 768 } | 768 } |
| (...skipping 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2049 CEntryStub ces(1); | 2049 CEntryStub ces(1); |
| 2050 Call(ces.GetCode(), RelocInfo::DEBUG_BREAK); | 2050 Call(ces.GetCode(), RelocInfo::DEBUG_BREAK); |
| 2051 } | 2051 } |
| 2052 #endif // ENABLE_DEBUGGER_SUPPORT | 2052 #endif // ENABLE_DEBUGGER_SUPPORT |
| 2053 | 2053 |
| 2054 | 2054 |
| 2055 void MacroAssembler::InvokeCode(Register code, | 2055 void MacroAssembler::InvokeCode(Register code, |
| 2056 const ParameterCount& expected, | 2056 const ParameterCount& expected, |
| 2057 const ParameterCount& actual, | 2057 const ParameterCount& actual, |
| 2058 InvokeFlag flag, | 2058 InvokeFlag flag, |
| 2059 CallWrapper* call_wrapper) { | 2059 const CallWrapper& call_wrapper) { |
| 2060 NearLabel done; | 2060 NearLabel done; |
| 2061 InvokePrologue(expected, | 2061 InvokePrologue(expected, |
| 2062 actual, | 2062 actual, |
| 2063 Handle<Code>::null(), | 2063 Handle<Code>::null(), |
| 2064 code, | 2064 code, |
| 2065 &done, | 2065 &done, |
| 2066 flag, | 2066 flag, |
| 2067 call_wrapper); | 2067 call_wrapper); |
| 2068 if (flag == CALL_FUNCTION) { | 2068 if (flag == CALL_FUNCTION) { |
| 2069 if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(code)); | 2069 call_wrapper.BeforeCall(CallSize(code)); |
| 2070 call(code); | 2070 call(code); |
| 2071 if (call_wrapper != NULL) call_wrapper->AfterCall(); | 2071 call_wrapper.AfterCall(); |
| 2072 } else { | 2072 } else { |
| 2073 ASSERT(flag == JUMP_FUNCTION); | 2073 ASSERT(flag == JUMP_FUNCTION); |
| 2074 jmp(code); | 2074 jmp(code); |
| 2075 } | 2075 } |
| 2076 bind(&done); | 2076 bind(&done); |
| 2077 } | 2077 } |
| 2078 | 2078 |
| 2079 | 2079 |
| 2080 void MacroAssembler::InvokeCode(Handle<Code> code, | 2080 void MacroAssembler::InvokeCode(Handle<Code> code, |
| 2081 const ParameterCount& expected, | 2081 const ParameterCount& expected, |
| 2082 const ParameterCount& actual, | 2082 const ParameterCount& actual, |
| 2083 RelocInfo::Mode rmode, | 2083 RelocInfo::Mode rmode, |
| 2084 InvokeFlag flag, | 2084 InvokeFlag flag, |
| 2085 CallWrapper* call_wrapper) { | 2085 const CallWrapper& call_wrapper) { |
| 2086 NearLabel done; | 2086 NearLabel done; |
| 2087 Register dummy = rax; | 2087 Register dummy = rax; |
| 2088 InvokePrologue(expected, | 2088 InvokePrologue(expected, |
| 2089 actual, | 2089 actual, |
| 2090 code, | 2090 code, |
| 2091 dummy, | 2091 dummy, |
| 2092 &done, | 2092 &done, |
| 2093 flag, | 2093 flag, |
| 2094 call_wrapper); | 2094 call_wrapper); |
| 2095 if (flag == CALL_FUNCTION) { | 2095 if (flag == CALL_FUNCTION) { |
| 2096 if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(code)); | 2096 call_wrapper.BeforeCall(CallSize(code)); |
| 2097 Call(code, rmode); | 2097 Call(code, rmode); |
| 2098 if (call_wrapper != NULL) call_wrapper->AfterCall(); | 2098 call_wrapper.AfterCall(); |
| 2099 } else { | 2099 } else { |
| 2100 ASSERT(flag == JUMP_FUNCTION); | 2100 ASSERT(flag == JUMP_FUNCTION); |
| 2101 Jump(code, rmode); | 2101 Jump(code, rmode); |
| 2102 } | 2102 } |
| 2103 bind(&done); | 2103 bind(&done); |
| 2104 } | 2104 } |
| 2105 | 2105 |
| 2106 | 2106 |
| 2107 void MacroAssembler::InvokeFunction(Register function, | 2107 void MacroAssembler::InvokeFunction(Register function, |
| 2108 const ParameterCount& actual, | 2108 const ParameterCount& actual, |
| 2109 InvokeFlag flag, | 2109 InvokeFlag flag, |
| 2110 CallWrapper* call_wrapper) { | 2110 const CallWrapper& call_wrapper) { |
| 2111 ASSERT(function.is(rdi)); | 2111 ASSERT(function.is(rdi)); |
| 2112 movq(rdx, FieldOperand(function, JSFunction::kSharedFunctionInfoOffset)); | 2112 movq(rdx, FieldOperand(function, JSFunction::kSharedFunctionInfoOffset)); |
| 2113 movq(rsi, FieldOperand(function, JSFunction::kContextOffset)); | 2113 movq(rsi, FieldOperand(function, JSFunction::kContextOffset)); |
| 2114 movsxlq(rbx, | 2114 movsxlq(rbx, |
| 2115 FieldOperand(rdx, SharedFunctionInfo::kFormalParameterCountOffset)); | 2115 FieldOperand(rdx, SharedFunctionInfo::kFormalParameterCountOffset)); |
| 2116 // Advances rdx to the end of the Code object header, to the start of | 2116 // Advances rdx to the end of the Code object header, to the start of |
| 2117 // the executable code. | 2117 // the executable code. |
| 2118 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); | 2118 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); |
| 2119 | 2119 |
| 2120 ParameterCount expected(rbx); | 2120 ParameterCount expected(rbx); |
| 2121 InvokeCode(rdx, expected, actual, flag, call_wrapper); | 2121 InvokeCode(rdx, expected, actual, flag, call_wrapper); |
| 2122 } | 2122 } |
| 2123 | 2123 |
| 2124 | 2124 |
| 2125 void MacroAssembler::InvokeFunction(JSFunction* function, | 2125 void MacroAssembler::InvokeFunction(JSFunction* function, |
| 2126 const ParameterCount& actual, | 2126 const ParameterCount& actual, |
| 2127 InvokeFlag flag, | 2127 InvokeFlag flag, |
| 2128 CallWrapper* call_wrapper) { | 2128 const CallWrapper& call_wrapper) { |
| 2129 ASSERT(function->is_compiled()); | 2129 ASSERT(function->is_compiled()); |
| 2130 // Get the function and setup the context. | 2130 // Get the function and setup the context. |
| 2131 Move(rdi, Handle<JSFunction>(function)); | 2131 Move(rdi, Handle<JSFunction>(function)); |
| 2132 movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 2132 movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); |
| 2133 | 2133 |
| 2134 if (V8::UseCrankshaft()) { | 2134 if (V8::UseCrankshaft()) { |
| 2135 // Since Crankshaft can recompile a function, we need to load | 2135 // Since Crankshaft can recompile a function, we need to load |
| 2136 // the Code object every time we call the function. | 2136 // the Code object every time we call the function. |
| 2137 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); | 2137 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); |
| 2138 ParameterCount expected(function->shared()->formal_parameter_count()); | 2138 ParameterCount expected(function->shared()->formal_parameter_count()); |
| (...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2912 CPU::FlushICache(address_, size_); | 2912 CPU::FlushICache(address_, size_); |
| 2913 | 2913 |
| 2914 // Check that the code was patched as expected. | 2914 // Check that the code was patched as expected. |
| 2915 ASSERT(masm_.pc_ == address_ + size_); | 2915 ASSERT(masm_.pc_ == address_ + size_); |
| 2916 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 2916 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
| 2917 } | 2917 } |
| 2918 | 2918 |
| 2919 } } // namespace v8::internal | 2919 } } // namespace v8::internal |
| 2920 | 2920 |
| 2921 #endif // V8_TARGET_ARCH_X64 | 2921 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |