diff options
author | Mike Pall <mike> | 2010-01-05 22:39:46 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-01-05 22:39:46 +0100 |
commit | c31ac26fb9803d4b09c27668b7c2d9a01385c9ba (patch) | |
tree | 620bc1af468b94d4676f5b6e335b5983e9f1ef8b /src/buildvm_x86.dasc | |
parent | b3e3bad0ffffe9e1a23c658b99810c687905005d (diff) | |
download | luajit-c31ac26fb9803d4b09c27668b7c2d9a01385c9ba.tar.gz luajit-c31ac26fb9803d4b09c27668b7c2d9a01385c9ba.tar.bz2 luajit-c31ac26fb9803d4b09c27668b7c2d9a01385c9ba.zip |
Add support for WIN64 exception handling to external unwinder.
Modify unwinding to always return _ff or _c unwind type.
Generate PE object .pdata/.xdata sections for x64 interpreter.
Can drop r12-r15 saves in Windows/x64 interpreter now.
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r-- | src/buildvm_x86.dasc | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index be2ee71e..e40ca6d7 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
@@ -168,28 +168,22 @@ | |||
168 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). | 168 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). |
169 | |.macro saveregs | 169 | |.macro saveregs |
170 | | push rbp; push rdi; push rsi; push rbx | 170 | | push rbp; push rdi; push rsi; push rbx |
171 | | push r15; push r14; push r13; push r12 | ||
172 | | sub rsp, CFRAME_SPACE | 171 | | sub rsp, CFRAME_SPACE |
173 | |.endmacro | 172 | |.endmacro |
174 | |.macro restoreregs | 173 | |.macro restoreregs |
175 | | add rsp, CFRAME_SPACE | 174 | | add rsp, CFRAME_SPACE |
176 | | pop r12; pop r13; pop r14; pop r15 | ||
177 | | pop rbx; pop rsi; pop rdi; pop rbp | 175 | | pop rbx; pop rsi; pop rdi; pop rbp |
178 | |.endmacro | 176 | |.endmacro |
179 | | | 177 | | |
180 | |.define SAVE_CFRAME, aword [rsp+aword*17] | 178 | |.define SAVE_CFRAME, aword [rsp+aword*13] |
181 | |.define SAVE_PC, dword [rsp+dword*33] | 179 | |.define SAVE_PC, dword [rsp+dword*25] |
182 | |.define SAVE_L, dword [rsp+dword*32] | 180 | |.define SAVE_L, dword [rsp+dword*24] |
183 | |.define SAVE_ERRF, dword [rsp+dword*31] | 181 | |.define SAVE_ERRF, dword [rsp+dword*23] |
184 | |.define SAVE_NRES, dword [rsp+dword*30] | 182 | |.define SAVE_NRES, dword [rsp+dword*22] |
185 | |.define TMP2, dword [rsp+dword*29] | 183 | |.define TMP2, dword [rsp+dword*21] |
186 | |.define TMP1, dword [rsp+dword*28] | 184 | |.define TMP1, dword [rsp+dword*20] |
187 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter | 185 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter |
188 | |.define SAVE_RET, aword [rsp+aword*13] //<-- rsp entering interpreter. | 186 | |.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. |
189 | |.define SAVE_R8, aword [rsp+aword*12] | ||
190 | |.define SAVE_R7, aword [rsp+aword*11] | ||
191 | |.define SAVE_R6, aword [rsp+aword*10] | ||
192 | |.define SAVE_R5, aword [rsp+aword*9] | ||
193 | |.define SAVE_R4, aword [rsp+aword*8] | 187 | |.define SAVE_R4, aword [rsp+aword*8] |
194 | |.define SAVE_R3, aword [rsp+aword*7] | 188 | |.define SAVE_R3, aword [rsp+aword*7] |
195 | |.define SAVE_R2, aword [rsp+aword*6] | 189 | |.define SAVE_R2, aword [rsp+aword*6] |
@@ -202,7 +196,7 @@ | |||
202 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee | 196 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee |
203 | | | 197 | | |
204 | |// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ). | 198 | |// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ). |
205 | |.define TMPQ, qword [rsp+aword*14] | 199 | |.define TMPQ, qword [rsp+aword*10] |
206 | |.define MULTRES, TMP2 | 200 | |.define MULTRES, TMP2 |
207 | |.define TMPa, ARG5 | 201 | |.define TMPa, ARG5 |
208 | |.define ARG5d, dword [rsp+aword*4] | 202 | |.define ARG5d, dword [rsp+aword*4] |
@@ -861,10 +855,12 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
861 | | mov dword [RA+RD*8-4], LJ_TNIL // Ensure one valid arg. | 855 | | mov dword [RA+RD*8-4], LJ_TNIL // Ensure one valid arg. |
862 | | mov RC, RA // ... in [RC] | 856 | | mov RC, RA // ... in [RC] |
863 | | mov PC, [RB-12] // Restore PC from [cont|PC]. | 857 | | mov PC, [RB-12] // Restore PC from [cont|PC]. |
864 | | mov RA, dword [RB-16] | ||
865 | |.if X64 | 858 | |.if X64 |
859 | | movsxd RAa, dword [RB-16] // May be negative on WIN64 with debug. | ||
866 | | lea KBASEa, qword [=>0] | 860 | | lea KBASEa, qword [=>0] |
867 | | add RAa, KBASEa | 861 | | add RAa, KBASEa |
862 | |.else | ||
863 | | mov RA, dword [RB-16] | ||
868 | |.endif | 864 | |.endif |
869 | | mov LFUNC:KBASE, [BASE-8] | 865 | | mov LFUNC:KBASE, [BASE-8] |
870 | | mov PROTO:KBASE, LFUNC:KBASE->pt | 866 | | mov PROTO:KBASE, LFUNC:KBASE->pt |
@@ -1854,7 +1850,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
1854 | |.ffunc coroutine_yield | 1850 | |.ffunc coroutine_yield |
1855 | | mov L:RB, SAVE_L | 1851 | | mov L:RB, SAVE_L |
1856 | | mov [RA-4], PC | 1852 | | mov [RA-4], PC |
1857 | | test aword L:RB->cframe, CFRAME_CANYIELD | 1853 | | test aword L:RB->cframe, CFRAME_RESUME |
1858 | | jz ->fff_fallback | 1854 | | jz ->fff_fallback |
1859 | | mov L:RB->base, RA | 1855 | | mov L:RB->base, RA |
1860 | | lea RC, [RA+NARGS:RC*8-8] | 1856 | | lea RC, [RA+NARGS:RC*8-8] |