duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

fastjmp_x86.asm (3546B)


      1 ; SPDX-FileCopyrightText: 2021 Connor McLaughlin <stenzek@gmail.com>
      2 ; SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
      3 
      4 IFDEF _M_X86_32
      5 
      6 ; -----------------------------------------
      7 ; 32-bit X86
      8 ; -----------------------------------------
      9   .386
     10   .model flat
     11 
     12 _TEXT         SEGMENT
     13 
     14 PUBLIC @fastjmp_set@4
     15 PUBLIC @fastjmp_jmp@8
     16 
     17 ; void fastjmp_set(fastjmp_buf*)
     18 @fastjmp_set@4   PROC
     19   mov eax, dword ptr [esp]
     20   mov edx, esp                              ; fixup stack pointer, so it doesn't include the call to fastjmp_set
     21   add edx, 4
     22   mov dword ptr [ecx], eax                  ; actually eip
     23   mov dword ptr [ecx + 4], ebx
     24   mov dword ptr [ecx + 8], edx              ; actually esp
     25   mov dword ptr [ecx + 12], ebp
     26   mov dword ptr [ecx + 16], esi
     27   mov dword ptr [ecx + 20], edi
     28   xor eax, eax
     29   ret
     30 @fastjmp_set@4   ENDP
     31 
     32 ; void __fastcall fastjmp_jmp(fastjmp_buf*, int)
     33 @fastjmp_jmp@8   PROC
     34   mov eax, edx                              ; return code
     35   mov edx, dword ptr [ecx + 0]
     36   mov ebx, dword ptr [ecx + 4]
     37   mov esp, dword ptr [ecx + 8]
     38   mov ebp, dword ptr [ecx + 12]
     39   mov esi, dword ptr [ecx + 16]
     40   mov edi, dword ptr [ecx + 20]
     41   jmp edx
     42 @fastjmp_jmp@8   ENDP
     43 
     44 _TEXT         ENDS
     45 
     46 ENDIF      ; _M_X86_32
     47 
     48 IFDEF _M_X86_64
     49 
     50 ; -----------------------------------------
     51 ; 64-bit X86
     52 ; -----------------------------------------
     53 _TEXT         SEGMENT
     54 
     55 PUBLIC fastjmp_set
     56 PUBLIC fastjmp_jmp
     57 
     58 ; void fastjmp_set(fastjmp_buf*)
     59 fastjmp_set   PROC
     60   mov rax, qword ptr [rsp]
     61   mov rdx, rsp                              ; fixup stack pointer, so it doesn't include the call to fastjmp_set
     62   add rdx, 8
     63   mov qword ptr [rcx], rax                  ; actually rip
     64   mov qword ptr [rcx + 8], rbx
     65   mov qword ptr [rcx + 16], rdx             ; actually rsp
     66   mov qword ptr [rcx + 24], rbp
     67   mov qword ptr [rcx + 32], rsi
     68   mov qword ptr [rcx + 40], rdi
     69   mov qword ptr [rcx + 48], r12
     70   mov qword ptr [rcx + 56], r13
     71   mov qword ptr [rcx + 64], r14
     72   mov qword ptr [rcx + 72], r15
     73   movaps xmmword ptr [rcx + 80], xmm6
     74   movaps xmmword ptr [rcx + 96], xmm7
     75   movaps xmmword ptr [rcx + 112], xmm8
     76   add rcx, 112                              ; split to two batches to fit displacement in a single byte
     77   movaps xmmword ptr [rcx + 16], xmm9
     78   movaps xmmword ptr [rcx + 32], xmm10
     79   movaps xmmword ptr [rcx + 48], xmm11
     80   movaps xmmword ptr [rcx + 64], xmm12
     81   movaps xmmword ptr [rcx + 80], xmm13
     82   movaps xmmword ptr [rcx + 96], xmm14
     83   movaps xmmword ptr [rcx + 112], xmm15
     84   xor eax, eax
     85   ret
     86 fastjmp_set   ENDP
     87 
     88 ; void fastjmp_jmp(fastjmp_buf*, int)
     89 fastjmp_jmp   PROC
     90   mov eax, edx                              ; return code
     91   mov rdx, qword ptr [rcx + 0]              ; actually rip
     92   mov rbx, qword ptr [rcx + 8]
     93   mov rsp, qword ptr [rcx + 16]
     94   mov rbp, qword ptr [rcx + 24]
     95   mov rsi, qword ptr [rcx + 32]
     96   mov rdi, qword ptr [rcx + 40]
     97   mov r12, qword ptr [rcx + 48]
     98   mov r13, qword ptr [rcx + 56]
     99   mov r14, qword ptr [rcx + 64]
    100   mov r15, qword ptr [rcx + 72]
    101   movaps xmm6, xmmword ptr [rcx + 80]
    102   movaps xmm7, xmmword ptr [rcx + 96]
    103   movaps xmm8, xmmword ptr [rcx + 112]
    104   add rcx, 112                              ; split to two batches to fit displacement in a single byte
    105   movaps xmm9, xmmword ptr [rcx + 16]
    106   movaps xmm10, xmmword ptr [rcx + 32]
    107   movaps xmm11, xmmword ptr [rcx + 48]
    108   movaps xmm12, xmmword ptr [rcx + 64]
    109   movaps xmm13, xmmword ptr [rcx + 80]
    110   movaps xmm14, xmmword ptr [rcx + 96]
    111   movaps xmm15, xmmword ptr [rcx + 112]
    112   jmp rdx
    113 fastjmp_jmp   ENDP
    114 
    115 _TEXT         ENDS
    116 
    117 ENDIF     ; _M_X86_64
    118 
    119 END