| ;/* |
| ; Copyright (C) 2013 Digia Plc. and/or its subsidiary(-ies) |
| ; |
| ; Redistribution and use in source and binary forms, with or without |
| ; modification, are permitted provided that the following conditions |
| ; are met: |
| ; 1. Redistributions of source code must retain the above copyright |
| ; notice, this list of conditions and the following disclaimer. |
| ; 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. |
| ; |
| ; THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| ; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| ; OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| ;*/ |
| |
| EXTERN getHostCallReturnValueWithExecState : near |
| |
| PUBLIC callToJavaScript |
| PUBLIC returnFromJavaScript |
| PUBLIC getHostCallReturnValue |
| |
| _TEXT SEGMENT |
| |
| callToJavaScript PROC |
| ;; This function is believed to be an accurate adaptation of the assembly created by the llint stub of the |
| ;; same name with changes for argument register differences. |
| mov r10, qword ptr[rsp] |
| push rbp |
| mov rax, rbp ; Save previous frame pointer |
| mov rbp, rsp |
| push r12 |
| push r13 |
| push r14 |
| push r15 |
| push rbx |
| push rsi |
| push rdi |
| |
| ; JIT operations can use up to 6 args (4 in registers and 2 on the stack). |
| ; In addition, X86_64 ABI specifies that the worse case stack alignment |
| ; requirement is 32 bytes. Based on these factors, we need to pad the stack |
| ; an additional 28h bytes. |
| sub rsp, 28h |
| |
| mov rbp, r9 |
| sub rbp, 40 |
| mov qword ptr[rbp + 40], 0 |
| mov qword ptr[rbp + 32], rdx |
| |
| mov rax, qword ptr[rdx] |
| mov qword ptr[rbp + 24], rax |
| mov qword ptr[rbp + 16], 1 |
| mov qword ptr[rbp + 8], r10 |
| mov qword ptr[rbp], rax |
| mov rax, rbp |
| |
| mov ebx, dword ptr[r8 + 40] |
| add rbx, 6 |
| sal rbx, 3 |
| sub rbp, rbx |
| mov qword ptr[rbp], rax |
| |
| mov rax, 5 |
| |
| copyHeaderLoop: |
| sub rax, 1 |
| mov r10, qword ptr[r8 + rax * 8] |
| mov qword ptr[rbp + rax * 8 + 16], r10 |
| test rax, rax |
| jnz copyHeaderLoop |
| |
| mov ebx, dword ptr[r8 + 24] |
| sub rbx, 1 |
| mov r10d, dword ptr[r8 + 40] |
| sub r10, 1 |
| cmp rbx, r10 |
| je copyArgs |
| mov rax, 0ah |
| |
| fillExtraArgsLoop: |
| sub r10, 1 |
| mov qword ptr[rbp + r10 * 8 + 56], rax |
| cmp rbx, r10 |
| jne fillExtraArgsLoop |
| |
| copyArgs: |
| mov rax, qword ptr[r8 + 48] |
| |
| copyArgsLoop: |
| test ebx, ebx |
| jz copyArgsDone |
| sub ebx, 1 |
| mov r10, qword ptr[rax + rbx * 8] |
| mov qword ptr[rbp + rbx * 8 + 56], r10 |
| jmp copyArgsLoop |
| |
| copyArgsDone: |
| mov qword ptr[rdx], rbp |
| mov r14, 0FFFF000000000000h |
| mov r15, 0FFFF000000000002h |
| call rcx |
| cmp qword ptr[rbp + 16], 1 |
| je calleeFramePopped |
| mov rbp, qword ptr[rbp] |
| |
| calleeFramePopped: |
| mov rbx, qword ptr[rbp + 32] ; VM.topCallFrame |
| mov r10, qword ptr[rbp + 24] |
| mov qword ptr[rbx], r10 |
| add rsp, 28h |
| pop rdi |
| pop rsi |
| pop rbx |
| pop r15 |
| pop r14 |
| pop r13 |
| pop r12 |
| pop rbp |
| ret |
| callToJavaScript ENDP |
| |
| callToNativeFunction PROC |
| ;; This function is believed to be an accurate adaptation of the assembly created by the llint stub of the |
| ;; same name with changes for argument register differences. |
| mov r10, qword ptr[rsp] |
| push rbp |
| mov rax, rbp ; Save previous frame pointer |
| mov rbp, rsp |
| push r12 |
| push r13 |
| push r14 |
| push r15 |
| push rbx |
| push rsi |
| push rdi |
| |
| ; JIT operations can use up to 6 args (4 in registers and 2 on the stack). |
| ; In addition, X86_64 ABI specifies that the worse case stack alignment |
| ; requirement is 32 bytes. Based on these factors, we need to pad the stack |
| ; an additional 28h bytes. |
| sub rsp, 28h |
| |
| mov rbp, r9 |
| sub rbp, 40 |
| mov qword ptr[rbp + 40], 0 |
| mov qword ptr[rbp + 32], rdx |
| |
| mov rax, qword ptr[rdx] |
| mov qword ptr[rbp + 24], rax |
| mov qword ptr[rbp + 16], 1 |
| mov qword ptr[rbp + 8], r10 |
| mov qword ptr[rbp], rax |
| mov rax, rbp |
| |
| mov ebx, dword ptr[r8 + 40] |
| add rbx, 6 |
| sal rbx, 3 |
| sub rbp, rbx |
| mov qword ptr[rbp], rax |
| |
| mov rax, 5 |
| |
| copyHeaderLoop: |
| sub rax, 1 |
| mov r10, qword ptr[r8 + rax * 8] |
| mov qword ptr[rbp + rax * 8 + 16], r10 |
| test rax, rax |
| jnz copyHeaderLoop |
| |
| mov ebx, dword ptr[r8 + 24] |
| sub rbx, 1 |
| mov r10d, dword ptr[r8 + 40] |
| sub r10, 1 |
| cmp rbx, r10 |
| je copyArgs |
| mov rax, 0ah |
| |
| fillExtraArgsLoop: |
| sub r10, 1 |
| mov qword ptr[rbp + r10 * 8 + 56], rax |
| cmp rbx, r10 |
| jne fillExtraArgsLoop |
| |
| copyArgs: |
| mov rax, qword ptr[r8 + 48] |
| |
| copyArgsLoop: |
| test rbx, rbx |
| jz copyArgsDone |
| sub rbx, 1 |
| mov r10, qword ptr[rax + rbx * 8] |
| mov qword ptr[rbp + rbx * 8 + 56], r10 |
| jmp copyArgsLoop |
| |
| copyArgsDone: |
| mov qword ptr[rdx], rbp |
| mov r14, 0FFFF000000000000h |
| mov r15, 0FFFF000000000002h |
| |
| mov rax, rcx |
| mov rcx, rbp |
| call rax |
| |
| cmp qword ptr[rbp + 16], 1 |
| je calleeFramePopped |
| mov rbp, qword ptr[rbp] |
| |
| calleeFramePopped: |
| mov rbx, qword ptr[rbp + 32] ; VM.topCallFrame |
| mov r10, qword ptr[rbp + 24] |
| mov qword ptr[rbx], r10 |
| add rsp, 28h |
| pop rdi |
| pop rsi |
| pop rbx |
| pop r15 |
| pop r14 |
| pop r13 |
| pop r12 |
| pop rbp |
| ret |
| callToNativeFunction ENDP |
| |
| returnFromJavaScript PROC |
| add rsp, 28h |
| pop rdi |
| pop rsi |
| pop rbx |
| pop r15 |
| pop r14 |
| pop r13 |
| pop r12 |
| pop rbp |
| ret |
| returnFromJavaScript ENDP |
| |
| getHostCallReturnValue PROC |
| mov rbp, [rbp] ; CallFrame |
| mov rcx, rbp ; rcx is first argument register on Windows |
| jmp getHostCallReturnValueWithExecState |
| getHostCallReturnValue ENDP |
| |
| _TEXT ENDS |
| |
| END |