diff options
Diffstat (limited to 'src/vm_x86.dasc')
-rw-r--r-- | src/vm_x86.dasc | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc index 6cdb8cbd..129ab000 100644 --- a/src/vm_x86.dasc +++ b/src/vm_x86.dasc | |||
@@ -222,6 +222,9 @@ | |||
222 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). | 222 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). |
223 | |.macro saveregs_ | 223 | |.macro saveregs_ |
224 | | push rbx; push r15; push r14 | 224 | | push rbx; push r15; push r14 |
225 | |.if NO_UNWIND | ||
226 | | push r13; push r12 | ||
227 | |.endif | ||
225 | | sub rsp, CFRAME_SPACE | 228 | | sub rsp, CFRAME_SPACE |
226 | |.endmacro | 229 | |.endmacro |
227 | |.macro saveregs | 230 | |.macro saveregs |
@@ -229,15 +232,28 @@ | |||
229 | |.endmacro | 232 | |.endmacro |
230 | |.macro restoreregs | 233 | |.macro restoreregs |
231 | | add rsp, CFRAME_SPACE | 234 | | add rsp, CFRAME_SPACE |
235 | |.if NO_UNWIND | ||
236 | | pop r12; pop r13 | ||
237 | |.endif | ||
232 | | pop r14; pop r15; pop rbx; pop rbp | 238 | | pop r14; pop r15; pop rbx; pop rbp |
233 | |.endmacro | 239 | |.endmacro |
234 | | | 240 | | |
235 | |//----- 16 byte aligned, | 241 | |//----- 16 byte aligned, |
242 | |.if NO_UNWIND | ||
243 | |.define SAVE_RET, aword [rsp+aword*11] //<-- rsp entering interpreter. | ||
244 | |.define SAVE_R4, aword [rsp+aword*10] | ||
245 | |.define SAVE_R3, aword [rsp+aword*9] | ||
246 | |.define SAVE_R2, aword [rsp+aword*8] | ||
247 | |.define SAVE_R1, aword [rsp+aword*7] | ||
248 | |.define SAVE_RU2, aword [rsp+aword*6] | ||
249 | |.define SAVE_RU1, aword [rsp+aword*5] //<-- rsp after register saves. | ||
250 | |.else | ||
236 | |.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. | 251 | |.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. |
237 | |.define SAVE_R4, aword [rsp+aword*8] | 252 | |.define SAVE_R4, aword [rsp+aword*8] |
238 | |.define SAVE_R3, aword [rsp+aword*7] | 253 | |.define SAVE_R3, aword [rsp+aword*7] |
239 | |.define SAVE_R2, aword [rsp+aword*6] | 254 | |.define SAVE_R2, aword [rsp+aword*6] |
240 | |.define SAVE_R1, aword [rsp+aword*5] //<-- rsp after register saves. | 255 | |.define SAVE_R1, aword [rsp+aword*5] //<-- rsp after register saves. |
256 | |.endif | ||
241 | |.define SAVE_CFRAME, aword [rsp+aword*4] | 257 | |.define SAVE_CFRAME, aword [rsp+aword*4] |
242 | |.define SAVE_PC, dword [rsp+dword*7] | 258 | |.define SAVE_PC, dword [rsp+dword*7] |
243 | |.define SAVE_L, dword [rsp+dword*6] | 259 | |.define SAVE_L, dword [rsp+dword*6] |
@@ -6119,6 +6135,10 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
6119 | "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ | 6135 | "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ |
6120 | "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ | 6136 | "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ |
6121 | "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ | 6137 | "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ |
6138 | #if LJ_NO_UNWIND | ||
6139 | "\t.byte 0x8d\n\t.uleb128 0x6\n" /* offset r13 */ | ||
6140 | "\t.byte 0x8c\n\t.uleb128 0x7\n" /* offset r12 */ | ||
6141 | #endif | ||
6122 | #else | 6142 | #else |
6123 | "\t.long .Lbegin\n" | 6143 | "\t.long .Lbegin\n" |
6124 | "\t.long %d\n" | 6144 | "\t.long %d\n" |
@@ -6154,6 +6174,7 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
6154 | "\t.align " SZPTR "\n" | 6174 | "\t.align " SZPTR "\n" |
6155 | ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); | 6175 | ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); |
6156 | #endif | 6176 | #endif |
6177 | #if !LJ_NO_UNWIND | ||
6157 | #if (defined(__sun__) && defined(__svr4__)) | 6178 | #if (defined(__sun__) && defined(__svr4__)) |
6158 | #if LJ_64 | 6179 | #if LJ_64 |
6159 | fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n"); | 6180 | fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n"); |
@@ -6242,7 +6263,9 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
6242 | "\t.align " SZPTR "\n" | 6263 | "\t.align " SZPTR "\n" |
6243 | ".LEFDE3:\n\n", (int)ctx->codesz - fcofs); | 6264 | ".LEFDE3:\n\n", (int)ctx->codesz - fcofs); |
6244 | #endif | 6265 | #endif |
6266 | #endif | ||
6245 | break; | 6267 | break; |
6268 | #if !LJ_NO_UNWIND | ||
6246 | /* Mental note: never let Apple design an assembler. | 6269 | /* Mental note: never let Apple design an assembler. |
6247 | ** Or a linker. Or a plastic case. But I digress. | 6270 | ** Or a linker. Or a plastic case. But I digress. |
6248 | */ | 6271 | */ |
@@ -6370,6 +6393,7 @@ static void emit_asm_debug(BuildCtx *ctx) | |||
6370 | #endif | 6393 | #endif |
6371 | } | 6394 | } |
6372 | break; | 6395 | break; |
6396 | #endif | ||
6373 | default: /* Difficult for other modes. */ | 6397 | default: /* Difficult for other modes. */ |
6374 | break; | 6398 | break; |
6375 | } | 6399 | } |