Imported Upstream version 1.0.0
[platform/upstream/js.git] / js / src / methodjit / TrampolineMasmX64.asm
1 ; -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 ; ***** BEGIN LICENSE BLOCK *****
3 ; Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 ;
5 ; The contents of this file are subject to the Mozilla Public License Version
6 ; 1.1 (the "License"); you may not use this file except in compliance with
7 ; the License. You may obtain a copy of the License at
8 ; http://www.mozilla.org/MPL/
9 ;
10 ; Software distributed under the License is distributed on an "AS IS" basis,
11 ; WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 ; for the specific language governing rights and limitations under the
13 ; License.
14 ;
15 ; The Original Code is mozilla.org code.
16 ;
17 ; The Initial Developer of the Original Code is Mozilla Japan.
18 ; Portions created by the Initial Developer are Copyright (C) 2010
19 ; the Initial Developer. All Rights Reserved.
20 ;
21 ; Contributor(s):
22 ;   Makoto Kato <m_kato@ga2.so-net.ne.jp>
23 ;
24 ; Alternatively, the contents of this file may be used under the terms of
25 ; either the GNU General Public License Version 2 or later (the "GPL"), or
26 ; the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 ; in which case the provisions of the GPL or the LGPL are applicable instead
28 ; of those above. If you wish to allow use of your version of this file only
29 ; under the terms of either the GPL or the LGPL, and not to allow others to
30 ; use your version of this file under the terms of the MPL, indicate your
31 ; decision by deleting the provisions above and replace them with the notice
32 ; and other provisions required by the GPL or the LGPL. If you do not delete
33 ; the provisions above, a recipient may use your version of this file under
34 ; the terms of any one of the MPL, the GPL or the LGPL.
35 ;
36 ; ***** END LICENSE BLOCK *****
37
38
39 extern js_InternalThrow:PROC
40 extern SetVMFrameRegs:PROC
41 extern PushActiveVMFrame:PROC
42 extern PopActiveVMFrame:PROC
43
44 .CODE
45
46 ; JSBool JaegerTrampoline(JSContext *cx, JSStackFrame *fp, void *code,
47 ;                         Value *stackLimit, void *safePoint);
48 JaegerTrampoline PROC FRAME
49     push    rbp
50     .PUSHREG rbp
51     mov     rbp, rsp
52     .SETFRAME rbp, 0
53     push    r12
54     .PUSHREG r12
55     push    r13
56     .PUSHREG r13
57     push    r14
58     .PUSHREG r14
59     push    r15
60     .PUSHREG r15
61     push    rdi
62     .PUSHREG rdi
63     push    rsi
64     .PUSHREG rsi
65     push    rbx
66     .PUSHREG rbx
67     .ENDPROLOG
68
69     ; Load mask registers
70     mov     r13, 0ffff800000000000h
71     mov     r14, 7fffffffffffh
72
73     ; Build the JIT frame.
74     ; rcx = cx
75     ; rdx = fp
76     ; r9 = inlineCallCount
77     ; fp must go into rbx
78     push    rdx     ; entryFp 
79     push    r9      ; inlineCallCount 
80     push    rcx     ; cx
81     push    rdx     ; fp
82     mov     rbx, rdx
83
84     ; Space for the rest of the VMFrame.
85     sub     rsp, 28h
86
87     ; This is actually part of the VMFrame.
88     mov     r10, [rbp+8*5+8]
89     push    r10
90
91     ; Set cx->regs and set the active frame. Save r8 and align frame in one
92     push    r8
93     mov     rcx, rsp
94     sub     rsp, 20h
95     call    SetVMFrameRegs
96     lea     rcx, [rsp+20h]
97     call    PushActiveVMFrame
98     add     rsp, 20h
99
100     ; Jump into the JIT code.
101     jmp     qword ptr [rsp]
102 JaegerTrampoline ENDP
103
104 ; void JaegerTrampolineReturn();
105 JaegerTrampolineReturn PROC FRAME
106     .ENDPROLOG
107     or      rcx, rdx
108     mov     qword ptr [rbx + 30h], rcx
109     sub     rsp, 20h
110     lea     rcx, [rsp+20h]
111     call    PopActiveVMFrame
112
113     add     rsp, 58h+20h
114     pop     rbx
115     pop     rsi
116     pop     rdi
117     pop     r15
118     pop     r14
119     pop     r13
120     pop     r12
121     pop     rbp
122     mov     rax, 1
123     ret
124 JaegerTrampolineReturn ENDP
125
126
127 ; void JaegerThrowpoline()
128 JaegerThrowpoline PROC FRAME
129     .ENDPROLOG
130     ; For Windows x64 stub calls, we pad the stack by 32 before
131     ; calling, so we must account for that here. See doStubCall.
132     lea     rcx, [rsp+20h]
133     call    js_InternalThrow
134     test    rax, rax
135     je      throwpoline_exit
136     add     rsp, 20h
137     jmp     rax
138
139 throwpoline_exit:
140     lea     rcx, [rsp+20h]
141     call    PopActiveVMFrame
142     add     rsp, 58h+20h
143     pop     rbx
144     pop     rsi
145     pop     rdi
146     pop     r15
147     pop     r14
148     pop     r13
149     pop     r12
150     pop     rbp
151     xor     rax, rax
152     ret
153 JaegerThrowpoline ENDP
154
155
156
157 ; void InjectJaegerReturn();
158 InjectJaegerReturn PROC FRAME
159     .ENDPROLOG
160     mov     rcx, qword ptr [rbx+30h] ; load fp->rval_ into typeReg
161     mov     rax, qword ptr [rbx+28h] ; fp->ncode_
162
163     ; Reimplementation of PunboxAssembler::loadValueAsComponents()
164     mov     rdx, r14
165     and     rdx, rcx
166     xor     rcx, rdx
167
168     ; For Windows x64 stub calls, we pad the stack by 32 before
169     ; calling, so we must account for that here. See doStubCall.
170     mov     rbx, qword ptr [rsp+38h+20h] ; f.fp
171     add     rsp, 20h
172     jmp     rax            ; return
173 InjectJaegerReturn ENDP
174
175 END