aboutsummaryrefslogtreecommitdiff
path: root/src/buildvm_x86.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2010-01-05 22:39:46 +0100
committerMike Pall <mike>2010-01-05 22:39:46 +0100
commitc31ac26fb9803d4b09c27668b7c2d9a01385c9ba (patch)
tree620bc1af468b94d4676f5b6e335b5983e9f1ef8b /src/buildvm_x86.dasc
parentb3e3bad0ffffe9e1a23c658b99810c687905005d (diff)
downloadluajit-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.dasc30
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]