Refactor and improve GETELEM IC (bug 602641, r=dmandelin).
[mozilla-central.git] / js / src / methodjit / TrampolineMasmX64.asm
blob3c5dac520c7d811f79070ad30bbc3ae46a51f6a2
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
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/
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.
15 ; The Original Code is mozilla.org code.
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.
21 ; Contributor(s):
22 ; Makoto Kato <m_kato@ga2.so-net.ne.jp>
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.
36 ; ***** END LICENSE BLOCK *****
39 extern js_InternalThrow:PROC
40 extern SetVMFrameRegs:PROC
41 extern PushActiveVMFrame:PROC
42 extern PopActiveVMFrame:PROC
44 .CODE
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
69 ; Load mask registers
70 mov r13, 0ffff800000000000h
71 mov r14, 7fffffffffffh
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
84 ; Space for the rest of the VMFrame.
85 sub rsp, 28h
87 ; This is actually part of the VMFrame.
88 mov r10, [rbp+8*5+8]
89 push r10
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
100 ; Jump into the JIT code.
101 jmp qword ptr [rsp]
102 JaegerTrampoline ENDP
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
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
124 JaegerTrampolineReturn ENDP
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
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
153 JaegerThrowpoline ENDP
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_
163 ; Reimplementation of PunboxAssembler::loadValueAsComponents()
164 mov rdx, r14
165 and rdx, rcx
166 xor rcx, rdx
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