summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/jit/JITStubsX86.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/jit/JITStubsX86.h')
-rw-r--r--Source/JavaScriptCore/jit/JITStubsX86.h488
1 files changed, 466 insertions, 22 deletions
diff --git a/Source/JavaScriptCore/jit/JITStubsX86.h b/Source/JavaScriptCore/jit/JITStubsX86.h
index d5bdcce26..7a26a5afa 100644
--- a/Source/JavaScriptCore/jit/JITStubsX86.h
+++ b/Source/JavaScriptCore/jit/JITStubsX86.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2009, 2013, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009, 2013 Apple Inc. All rights reserved.
* Copyright (C) 2008 Cameron Zwarich <cwzwarich@uwaterloo.ca>
* Copyright (C) Research In Motion Limited 2010, 2011. All rights reserved.
*
@@ -12,7 +12,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Inc. ("Apple") nor the names of
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
@@ -32,6 +32,7 @@
#define JITStubsX86_h
#include "JITStubsX86Common.h"
+#include <wtf/InlineASM.h>
#if !CPU(X86)
#error "JITStubsX86.h should only be #included if CPU(X86)"
@@ -43,9 +44,9 @@
namespace JSC {
-#if COMPILER(GCC_OR_CLANG)
+#if COMPILER(GCC)
-#if ENABLE(MASM_PROBE)
+#if USE(MASM_PROBE)
asm (
".globl " SYMBOL_STRING(ctiMasmProbeTrampoline) "\n"
HIDE_SYMBOL(ctiMasmProbeTrampoline) "\n"
@@ -95,14 +96,14 @@ SYMBOL_STRING(ctiMasmProbeTrampoline) ":" "\n"
"movl 6 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%eax), %ecx" "\n"
"movl %ecx, " STRINGIZE_VALUE_OF(PROBE_CPU_ESP_OFFSET) "(%ebp)" "\n"
- "movq %xmm0, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM0_OFFSET) "(%ebp)" "\n"
- "movq %xmm1, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM1_OFFSET) "(%ebp)" "\n"
- "movq %xmm2, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM2_OFFSET) "(%ebp)" "\n"
- "movq %xmm3, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM3_OFFSET) "(%ebp)" "\n"
- "movq %xmm4, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM4_OFFSET) "(%ebp)" "\n"
- "movq %xmm5, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM5_OFFSET) "(%ebp)" "\n"
- "movq %xmm6, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM6_OFFSET) "(%ebp)" "\n"
- "movq %xmm7, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM7_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm0, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM0_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm1, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM1_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm2, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM2_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm3, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM3_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm4, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM4_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm5, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM5_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm6, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM6_OFFSET) "(%ebp)" "\n"
+ "movdqa %xmm7, " STRINGIZE_VALUE_OF(PROBE_CPU_XMM7_OFFSET) "(%ebp)" "\n"
// Reserve stack space for the arg while maintaining the required stack
// pointer 32 byte alignment:
@@ -119,14 +120,14 @@ SYMBOL_STRING(ctiMasmProbeTrampoline) ":" "\n"
"movl " STRINGIZE_VALUE_OF(PROBE_CPU_ESI_OFFSET) "(%ebp), %esi" "\n"
"movl " STRINGIZE_VALUE_OF(PROBE_CPU_EDI_OFFSET) "(%ebp), %edi" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM0_OFFSET) "(%ebp), %xmm0" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM1_OFFSET) "(%ebp), %xmm1" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM2_OFFSET) "(%ebp), %xmm2" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM3_OFFSET) "(%ebp), %xmm3" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM4_OFFSET) "(%ebp), %xmm4" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM5_OFFSET) "(%ebp), %xmm5" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM6_OFFSET) "(%ebp), %xmm6" "\n"
- "movq " STRINGIZE_VALUE_OF(PROBE_CPU_XMM7_OFFSET) "(%ebp), %xmm7" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM0_OFFSET) "(%ebp), %xmm0" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM1_OFFSET) "(%ebp), %xmm1" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM2_OFFSET) "(%ebp), %xmm2" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM3_OFFSET) "(%ebp), %xmm3" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM4_OFFSET) "(%ebp), %xmm4" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM5_OFFSET) "(%ebp), %xmm5" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM6_OFFSET) "(%ebp), %xmm6" "\n"
+ "movdqa " STRINGIZE_VALUE_OF(PROBE_CPU_XMM7_OFFSET) "(%ebp), %xmm7" "\n"
// There are 6 more registers left to restore:
// eax, ecx, ebp, esp, eip, and eflags.
@@ -196,9 +197,452 @@ SYMBOL_STRING(ctiMasmProbeTrampolineEnd) ":" "\n"
"popl %ebp" "\n"
"ret" "\n"
);
-#endif // ENABLE(MASM_PROBE)
+#endif // USE(MASM_PROBE)
-#endif // COMPILER(GCC_OR_CLANG)
+#if OS(WINDOWS)
+extern "C" {
+
+ // FIXME: Since Windows doesn't use the LLInt, we have inline stubs here.
+ // Until the LLInt is changed to support Windows, these stub needs to be updated.
+ asm (
+ ".globl " SYMBOL_STRING(callToJavaScript) "\n"
+ HIDE_SYMBOL(callToJavaScript) "\n"
+ SYMBOL_STRING(callToJavaScript) ":" "\n"
+ "mov (%esp),%edx" "\n"
+ "push %ebp" "\n"
+ "mov %ebp,%eax" "\n"
+ "mov %esp,%ebp" "\n"
+ "push %esi" "\n"
+ "push %edi" "\n"
+ "push %ebx" "\n"
+ "sub $0x1c,%esp" "\n"
+ "mov 0x34(%esp),%ecx" "\n"
+ "mov 0x38(%esp),%esi" "\n"
+ "mov 0x3c(%esp),%ebp" "\n"
+ "sub $0x20,%ebp" "\n"
+ "movl $0x0,0x24(%ebp)" "\n"
+ "movl $0x0,0x20(%ebp)" "\n"
+ "movl $0x0,0x1c(%ebp)" "\n"
+ "mov %ecx,0x18(%ebp)" "\n"
+ "mov (%ecx),%ebx" "\n"
+ "movl $0x0,0x14(%ebp)" "\n"
+ "mov %ebx,0x10(%ebp)" "\n"
+ "movl $0x0,0xc(%ebp)" "\n"
+ "movl $0x1,0x8(%ebp)" "\n"
+ "mov %edx,0x4(%ebp)" "\n"
+ "mov %eax,0x0(%ebp)" "\n"
+ "mov %ebp,%eax" "\n"
+
+ "mov 0x28(%esi),%edx" "\n"
+ "add $0x5,%edx" "\n"
+ "shl $0x3,%edx" "\n"
+ "sub %edx,%ebp" "\n"
+ "mov %eax,0x0(%ebp)" "\n"
+
+ "mov $0x5,%eax" "\n"
+
+ ".copyHeaderLoop:" "\n"
+ "sub $0x1,%eax" "\n"
+ "mov (%esi,%eax,8),%ecx" "\n"
+ "mov %ecx,0x8(%ebp,%eax,8)" "\n"
+ "mov 0x4(%esi,%eax,8),%ecx" "\n"
+ "mov %ecx,0xc(%ebp,%eax,8)" "\n"
+ "test %eax,%eax" "\n"
+ "jne .copyHeaderLoop" "\n"
+
+ "mov 0x18(%esi),%edx" "\n"
+ "sub $0x1,%edx" "\n"
+ "mov 0x28(%esi),%ecx" "\n"
+ "sub $0x1,%ecx" "\n"
+
+ "cmp %ecx,%edx" "\n"
+ "je .copyArgs" "\n"
+
+ "xor %eax,%eax" "\n"
+ "mov $0xfffffffc,%ebx" "\n"
+
+ ".fillExtraArgsLoop:" "\n"
+ "sub $0x1,%ecx" "\n"
+ "mov %eax,0x30(%ebp,%ecx,8)" "\n"
+ "mov %ebx,0x34(%ebp,%ecx,8)" "\n"
+ "cmp %ecx,%edx" "\n"
+ "jne .fillExtraArgsLoop" "\n"
+
+ ".copyArgs:" "\n"
+ "mov 0x2c(%esi),%eax" "\n"
+
+ ".copyArgsLoop:" "\n"
+ "test %edx,%edx" "\n"
+ "je .copyArgsDone" "\n"
+ "sub $0x1,%edx" "\n"
+ "mov (%eax,%edx,8),%ecx" "\n"
+ "mov 0x4(%eax,%edx,8),%ebx" "\n"
+ "mov %ecx,0x30(%ebp,%edx,8)" "\n"
+ "mov %ebx,0x34(%ebp,%edx,8)" "\n"
+ "jmp .copyArgsLoop" "\n"
+
+ ".copyArgsDone:" "\n"
+ "mov 0x34(%esp),%ecx" "\n"
+ "mov %ebp,(%ecx)" "\n"
+
+ "call *0x30(%esp)" "\n"
+
+ "cmpl $0x1,0x8(%ebp)" "\n"
+ "je .calleeFramePopped" "\n"
+ "mov 0x0(%ebp),%ebp" "\n"
+
+ ".calleeFramePopped:" "\n"
+ "mov 0x18(%ebp),%ecx" "\n"
+ "mov 0x10(%ebp),%ebx" "\n"
+ "mov %ebx,(%ecx)" "\n"
+
+ "add $0x1c,%esp" "\n"
+ "pop %ebx" "\n"
+ "pop %edi" "\n"
+ "pop %esi" "\n"
+ "pop %ebp" "\n"
+ "ret" "\n"
+
+ ".globl " SYMBOL_STRING(returnFromJavaScript) "\n"
+ HIDE_SYMBOL(returnFromJavaScript) "\n"
+ SYMBOL_STRING(returnFromJavaScript) ":" "\n"
+ "add $0x1c,%esp" "\n"
+ "pop %ebx" "\n"
+ "pop %edi" "\n"
+ "pop %esi" "\n"
+ "pop %ebp" "\n"
+ "ret" "\n"
+
+ ".globl " SYMBOL_STRING(callToNativeFunction) "\n"
+ HIDE_SYMBOL(callToNativeFunction) "\n"
+ SYMBOL_STRING(callToNativeFunction) ":" "\n"
+ "mov (%esp),%edx" "\n"
+ "push %ebp" "\n"
+ "mov %ebp,%eax" "\n"
+ "mov %esp,%ebp" "\n"
+ "push %esi" "\n"
+ "push %edi" "\n"
+ "push %ebx" "\n"
+ "sub $0x1c,%esp" "\n"
+ "mov 0x34(%esp),%ecx" "\n"
+ "mov 0x38(%esp),%esi" "\n"
+ "mov 0x3c(%esp),%ebp" "\n"
+ "sub $0x20,%ebp" "\n"
+ "movl $0x0,0x24(%ebp)" "\n"
+ "movl $0x0,0x20(%ebp)" "\n"
+ "movl $0x0,0x1c(%ebp)" "\n"
+ "mov %ecx,0x18(%ebp)" "\n"
+ "mov (%ecx),%ebx" "\n"
+ "movl $0x0,0x14(%ebp)" "\n"
+ "mov %ebx,0x10(%ebp)" "\n"
+ "movl $0x0,0xc(%ebp)" "\n"
+ "movl $0x1,0x8(%ebp)" "\n"
+ "mov %edx,0x4(%ebp)" "\n"
+ "mov %eax,0x0(%ebp)" "\n"
+ "mov %ebp,%eax" "\n"
+
+ "mov 0x28(%esi),%edx" "\n"
+ "add $0x5,%edx" "\n"
+ "shl $0x3,%edx" "\n"
+ "sub %edx,%ebp" "\n"
+ "mov %eax,0x0(%ebp)" "\n"
+
+ "mov $0x5,%eax" "\n"
+
+ "copyHeaderLoop:" "\n"
+ "sub $0x1,%eax" "\n"
+ "mov (%esi,%eax,8),%ecx" "\n"
+ "mov %ecx,0x8(%ebp,%eax,8)" "\n"
+ "mov 0x4(%esi,%eax,8),%ecx" "\n"
+ "mov %ecx,0xc(%ebp,%eax,8)" "\n"
+ "test %eax,%eax" "\n"
+ "jne copyHeaderLoop" "\n"
+
+ "mov 0x18(%esi),%edx" "\n"
+ "sub $0x1,%edx" "\n"
+ "mov 0x28(%esi),%ecx" "\n"
+ "sub $0x1,%ecx" "\n"
+
+ "cmp %ecx,%edx" "\n"
+ "je copyArgs" "\n"
+
+ "xor %eax,%eax" "\n"
+ "mov $0xfffffffc,%ebx" "\n"
+
+ "fillExtraArgsLoop:" "\n"
+ "sub $0x1,%ecx" "\n"
+ "mov %eax,0x30(%ebp,%ecx,8)" "\n"
+ "mov %ebx,0x34(%ebp,%ecx,8)" "\n"
+ "cmp %ecx,%edx" "\n"
+ "jne fillExtraArgsLoop" "\n"
+
+ "copyArgs:" "\n"
+ "mov 0x2c(%esi),%eax" "\n"
+
+ "copyArgsLoop:" "\n"
+ "test %edx,%edx" "\n"
+ "je copyArgsDone" "\n"
+ "sub $0x1,%edx" "\n"
+ "mov (%eax,%edx,8),%ecx" "\n"
+ "mov 0x4(%eax,%edx,8),%ebx" "\n"
+ "mov %ecx,0x30(%ebp,%edx,8)" "\n"
+ "mov %ebx,0x34(%ebp,%edx,8)" "\n"
+ "jmp copyArgsLoop" "\n"
+
+ "copyArgsDone:" "\n"
+ "mov 0x34(%esp),%ecx" "\n"
+ "mov %ebp,(%ecx)" "\n"
+
+ "mov 0x30(%esp),%edi" "\n"
+ "mov %ebp,0x30(%esp)" "\n"
+ "mov %ebp,%ecx" "\n"
+ "call *%edi" "\n"
+
+ "cmpl $0x1,0x8(%ebp)" "\n"
+ "je calleeFramePopped" "\n"
+ "mov 0x0(%ebp),%ebp" "\n"
+
+ "calleeFramePopped:" "\n"
+ "mov 0x18(%ebp),%ecx" "\n"
+ "mov 0x10(%ebp),%ebx" "\n"
+ "mov %ebx,(%ecx)" "\n"
+
+ "add $0x1c,%esp" "\n"
+ "pop %ebx" "\n"
+ "pop %edi" "\n"
+ "pop %esi" "\n"
+ "pop %ebp" "\n"
+ "ret" "\n"
+ );
+}
+
+#endif // OS(WINDOWS)
+
+#endif // COMPILER(GCC)
+
+#if COMPILER(MSVC)
+
+extern "C" {
+
+ // FIXME: Since Windows doesn't use the LLInt, we have inline stubs here.
+ // Until the LLInt is changed to support Windows, these stub needs to be updated.
+ __declspec(naked) EncodedJSValue callToJavaScript(void* code, ExecState**, ProtoCallFrame*, Register*)
+ {
+ __asm {
+ mov edx, [esp]
+ push ebp;
+ mov eax, ebp;
+ mov ebp, esp;
+ push esi;
+ push edi;
+ push ebx;
+ sub esp, 0x1c;
+ mov ecx, dword ptr[esp + 0x34];
+ mov esi, dword ptr[esp + 0x38];
+ mov ebp, dword ptr[esp + 0x3c];
+ sub ebp, 0x20;
+ mov dword ptr[ebp + 0x24], 0;
+ mov dword ptr[ebp + 0x20], 0;
+ mov dword ptr[ebp + 0x1c], 0;
+ mov dword ptr[ebp + 0x18], ecx;
+ mov ebx, [ecx];
+ mov dword ptr[ebp + 0x14], 0;
+ mov dword ptr[ebp + 0x10], ebx;
+ mov dword ptr[ebp + 0xc], 0;
+ mov dword ptr[ebp + 0x8], 1;
+ mov dword ptr[ebp + 0x4], edx;
+ mov dword ptr[ebp], eax;
+ mov eax, ebp;
+
+ mov edx, dword ptr[esi + 0x28];
+ add edx, 5;
+ sal edx, 3;
+ sub ebp, edx;
+ mov dword ptr[ebp], eax;
+
+ mov eax, 5;
+
+ copyHeaderLoop:
+ sub eax, 1;
+ mov ecx, dword ptr[esi + eax * 8];
+ mov dword ptr 8[ebp + eax * 8], ecx;
+ mov ecx, dword ptr 4[esi + eax * 8];
+ mov dword ptr 12[ebp + eax * 8], ecx;
+ test eax, eax;
+ jnz copyHeaderLoop;
+
+ mov edx, dword ptr[esi + 0x18];
+ sub edx, 1;
+ mov ecx, dword ptr[esi + 0x28];
+ sub ecx, 1;
+
+ cmp edx, ecx;
+ je copyArgs;
+
+ xor eax, eax;
+ mov ebx, -4;
+
+ fillExtraArgsLoop:
+ sub ecx, 1;
+ mov dword ptr 0x30[ebp + ecx * 8], eax;
+ mov dword ptr 0x34[ebp + ecx * 8], ebx;
+ cmp edx, ecx;
+ jne fillExtraArgsLoop;
+
+ copyArgs:
+ mov eax, dword ptr[esi + 0x2c];
+
+ copyArgsLoop:
+ test edx, edx;
+ jz copyArgsDone;
+ sub edx, 1;
+ mov ecx, dword ptr 0[eax + edx * 8];
+ mov ebx, dword ptr 4[eax + edx * 8];
+ mov dword ptr 0x30[ebp + edx * 8], ecx;
+ mov dword ptr 0x34[ebp + edx * 8], ebx;
+ jmp copyArgsLoop;
+
+ copyArgsDone:
+ mov ecx, dword ptr[esp + 0x34];
+ mov dword ptr[ecx], ebp;
+
+ call dword ptr[esp + 0x30];
+
+ cmp dword ptr[ebp + 8], 1;
+ je calleeFramePopped;
+ mov ebp, dword ptr[ebp];
+
+ calleeFramePopped:
+ mov ecx, dword ptr[ebp + 0x18];
+ mov ebx, dword ptr[ebp + 0x10];
+ mov dword ptr[ecx], ebx;
+
+ add esp, 0x1c;
+ pop ebx;
+ pop edi;
+ pop esi;
+ pop ebp;
+ ret;
+ }
+ }
+
+ __declspec(naked) void returnFromJavaScript()
+ {
+ __asm {
+ add esp, 0x1c;
+ pop ebx;
+ pop edi;
+ pop esi;
+ pop ebp;
+ ret;
+ }
+ }
+
+ __declspec(naked) EncodedJSValue callToNativeFunction(void* code, ExecState**, ProtoCallFrame*, Register*)
+ {
+ __asm {
+ mov edx, [esp]
+ push ebp;
+ mov eax, ebp;
+ mov ebp, esp;
+ push esi;
+ push edi;
+ push ebx;
+ sub esp, 0x1c;
+ mov ecx, [esp + 0x34];
+ mov esi, [esp + 0x38];
+ mov ebp, [esp + 0x3c];
+ sub ebp, 0x20;
+ mov dword ptr[ebp + 0x24], 0;
+ mov dword ptr[ebp + 0x20], 0;
+ mov dword ptr[ebp + 0x1c], 0;
+ mov dword ptr[ebp + 0x18], ecx;
+ mov ebx, [ecx];
+ mov dword ptr[ebp + 0x14], 0;
+ mov dword ptr[ebp + 0x10], ebx;
+ mov dword ptr[ebp + 0xc], 0;
+ mov dword ptr[ebp + 0x8], 1;
+ mov dword ptr[ebp + 0x4], edx;
+ mov dword ptr[ebp], eax;
+ mov eax, ebp;
+
+ mov edx, dword ptr[esi + 0x28];
+ add edx, 5;
+ sal edx, 3;
+ sub ebp, edx;
+ mov dword ptr[ebp], eax;
+
+ mov eax, 5;
+
+ copyHeaderLoop:
+ sub eax, 1;
+ mov ecx, dword ptr[esi + eax * 8];
+ mov dword ptr 8[ebp + eax * 8], ecx;
+ mov ecx, dword ptr 4[esi + eax * 8];
+ mov dword ptr 12[ebp + eax * 8], ecx;
+ test eax, eax;
+ jnz copyHeaderLoop;
+
+ mov edx, dword ptr[esi + 0x18];
+ sub edx, 1;
+ mov ecx, dword ptr[esi + 0x28];
+ sub ecx, 1;
+
+ cmp edx, ecx;
+ je copyArgs;
+
+ xor eax, eax;
+ mov ebx, -4;
+
+ fillExtraArgsLoop:
+ sub ecx, 1;
+ mov dword ptr 0x30[ebp + ecx * 8], eax;
+ mov dword ptr 0x34[ebp + ecx * 8], ebx;
+ cmp edx, ecx;
+ jne fillExtraArgsLoop;
+
+ copyArgs:
+ mov eax, dword ptr[esi + 0x2c];
+
+ copyArgsLoop:
+ test edx, edx;
+ jz copyArgsDone;
+ sub edx, 1;
+ mov ecx, dword ptr 0[eax + edx * 8];
+ mov ebx, dword ptr 4[eax + edx * 8];
+ mov dword ptr 0x30[ebp + edx * 8], ecx;
+ mov dword ptr 0x34[ebp + edx * 8], ebx;
+ jmp copyArgsLoop;
+
+ copyArgsDone:
+ mov ecx, dword ptr[esp + 0x34];
+ mov dword ptr[ecx], ebp;
+
+ mov edi, dword ptr[esp + 0x30];
+ mov dword ptr[esp + 0x30], ebp;
+ mov ecx, ebp;
+ call edi;
+
+ cmp dword ptr[ebp + 8], 1;
+ je calleeFramePopped;
+ mov ebp, dword ptr[ebp];
+
+ calleeFramePopped:
+ mov ecx, dword ptr[ebp + 0x18];
+ mov ebx, dword ptr[ebp + 0x10];
+ mov dword ptr[ecx], ebx;
+
+ add esp, 0x1c;
+ pop ebx;
+ pop edi;
+ pop esi;
+ pop ebp;
+ ret;
+ }
+ }
+}
+
+#endif // COMPILER(MSVC)
} // namespace JSC