This repository has been archived on 2022-08-10. You can view files and clone it, but cannot push or open issues or pull requests.
chez-openbsd/c/a6nt-jump.asm
2022-07-29 15:12:07 +02:00

70 lines
1.5 KiB
NASM
Executable file

; We do not use Microsoft's implementation because its longjmp unwinds
; the stack to support C++ destructors, and the stack frames generated
; by Chez Scheme do not have the required information for this to work
; properly.
; See https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention
.code
S_setjmp proc
; store nonvolatile registers & control words
mov [rcx], rbx
mov [rcx+08h], rbp
mov [rcx+10h], rdi
mov [rcx+18h], rsi
mov [rcx+20h], rsp
mov [rcx+28h], r12
mov [rcx+30h], r13
mov [rcx+38h], r14
mov [rcx+40h], r15
stmxcsr [rcx+48h]
fnstcw [rcx+4ch]
movdqu [rcx+50h], xmm6
movdqu [rcx+60h], xmm7
movdqu [rcx+70h], xmm8
movdqu [rcx+80h], xmm9
movdqu [rcx+90h], xmm10
movdqu [rcx+0a0h], xmm11
movdqu [rcx+0b0h], xmm12
movdqu [rcx+0c0h], xmm13
movdqu [rcx+0d0h], xmm14
movdqu [rcx+0e0h], xmm15
; store return address
mov rax, [rsp]
mov [rcx+0f0h], rax
xor eax, eax
ret
S_setjmp endp
S_longjmp proc
; restore nonvolatile registers & control words
mov rbx, [rcx]
mov rbp, [rcx+08h]
mov rdi, [rcx+10h]
mov rsi, [rcx+18h]
mov rsp, [rcx+20h]
mov r12, [rcx+28h]
mov r13, [rcx+30h]
mov r14, [rcx+38h]
mov r15, [rcx+40h]
ldmxcsr [rcx+48h]
fldcw [rcx+4ch]
movdqu xmm6, [rcx+50h]
movdqu xmm7, [rcx+60h]
movdqu xmm8, [rcx+70h]
movdqu xmm9, [rcx+80h]
movdqu xmm10, [rcx+90h]
movdqu xmm11, [rcx+0a0h]
movdqu xmm12, [rcx+0b0h]
movdqu xmm13, [rcx+0c0h]
movdqu xmm14, [rcx+0d0h]
movdqu xmm15, [rcx+0e0h]
; restore return address
mov rax, [rcx+0f0h]
mov [rsp], rax
mov rax, rdx
ret
S_longjmp endp
end