# # # Nim's Runtime Library # (c) Copyright 2015 Rokas Kupstys # # See the file "copying.txt", included in this # distribution, for details about the copyright. # # Partially based on code from musl libc Copyright © 2005-2014 Rich Felker, et al. .globl narch_coroExecWithStack .globl narch_setjmp .globl narch_longjmp #if defined(__MINGW32__) || defined(__MINGW64__) .globl @narch_coroExecWithStack@8 .globl @narch_setjmp@4 .globl @narch_longjmp@8 #endif .text #if defined(__MINGW32__) || defined(__MINGW64__) @narch_coroExecWithStack@8: #endif narch_coroExecWithStack: mov %edx, %esp # swap stack with one passed to func sub $0x10, %esp # 16-byte alignment and $-0x10, %esp # sub $4, %esp # Simulate misalignment caused by return addr jmp *%ecx #if defined(__MINGW32__) || defined(__MINGW64__) @narch_setjmp@4: #endif narch_setjmp: mov %ebx, (%ecx) mov %esi, 0x04(%ecx) mov %edi, 0x08(%ecx) mov %ebp, 0x0C(%ecx) lea 0x04(%esp), %eax mov %eax, 0x10(%ecx) mov (%esp), %eax mov %eax, 0x14(%ecx) xor %eax, %eax ret #if defined(__MINGW32__) || defined(__MINGW64__) @narch_longjmp@8: #endif narch_longjmp: mov %edx, %eax test %eax, %eax jnz narch_longjmp_1 inc %eax narch_longjmp_1: mov (%ecx), %ebx mov 0x04(%ecx), %esi mov 0x08(%ecx), %edi mov 0x0C(%ecx), %ebp mov 0x10(%ecx), %esp mov 0x14(%ecx), %edx jmp *%edx