// Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
// This source file is part of the Cangjie project, licensed under Apache-2.0
// with Runtime Library Exception.
//
// See https://cangjie-lang.cn/pages/LICENSE for license information.

// The Cangjie API is in Beta. For details on its capabilities and limitations, please refer to the README file.

#define StackGrowStubFrame           (8 * 46)

// This signal handler stub relies on MRT_PrepareToHandleSignal to put continuation pc in x17.
// Continuation pc describes the control flow after signal handling completes.


    .def CJ_MCC_StackGrowStub;
    .scl 2;
    .type 32;
    .endef
    .global CJ_MCC_StackGrowStub
    .p2align    4, 0x90
CJ_MCC_StackGrowStub:
    .seh_proc CJ_MCC_StackGrowStub

    pushq   %rbp
    .seh_pushreg %rbp
    movq    %rsp, %rbp
    .seh_setframe %rbp, 0
    subq    $StackGrowStubFrame, %rsp
    .seh_stackalloc StackGrowStubFrame
    .seh_endprologue

    movq    %rax, -8(%rbp)
    movq    %rbx, -16(%rbp)
    movq    %rcx, -24(%rbp)
    movq    %rdx, -32(%rbp)
    movq    %rdi, -40(%rbp)
    movq    %rsi, -48(%rbp)
    movq    %r8, -56(%rbp)
    movq    %r9, -64(%rbp)
    movq    %r10, -72(%rbp)
    movq    %r11, -80(%rbp)
    movq    %r12, -88(%rbp)
    movq    %r13, -96(%rbp)
    movq    %r14, -104(%rbp)
    movq    %r15, -112(%rbp)

    movapd  %xmm0, -128(%rbp)
    movapd  %xmm1, -144(%rbp)
    movapd  %xmm2, -160(%rbp)
    movapd  %xmm3, -176(%rbp)
    movapd  %xmm4, -192(%rbp)
    movapd  %xmm5, -208(%rbp)
    movapd  %xmm6, -224(%rbp)
    movapd  %xmm7, -240(%rbp)
    movapd  %xmm8, -256(%rbp)
    movapd  %xmm9, -272(%rbp)
    movapd  %xmm10, -288(%rbp)
    movapd  %xmm11, -304(%rbp)
    movapd  %xmm12, -320(%rbp)
    movapd  %xmm13, -336(%rbp)
    movapd  %xmm14, -352(%rbp)
    movapd  %xmm15, -368(%rbp)

    movq   $1, %r8
    movq   %rbp, %rdx
    leaq   31(%rip), %rcx
    movq   %r15, %r9
    callq  MRT_UpdateUwContext

    movq   %rsp,    %rcx
    addq   $StackGrowStubFrame, %rcx
    movq   -8(%rbp), %rdx
    movq   8(%rbp),  %r8
    callq  MRT_StackGrow
    .global unwindPCForStackGrowStub
unwindPCForStackGrowStub:

    addq %rax, %rsp
    addq %rax, %rbp
    addq %rax, %gs:0x08

    movq   %rax, %rcx
    callq  MRT_FreeOldStack

    callq  MRT_GetThreadLocalData
    movq   %rax, %r15
    movq   %rax, %rcx
    callq  MRT_DeleteC2NContext

    addq    $StackGrowStubFrame, %rsp

    movq    -8(%rbp), %rax
    movq    -16(%rbp), %rbx
    movq    -24(%rbp), %rcx
    movq    -32(%rbp), %rdx
    movq    -40(%rbp), %rdi
    movq    -48(%rbp), %rsi
    movq    -56(%rbp), %r8
    movq    -64(%rbp), %r9
    movq    -72(%rbp), %r10
    movq    -80(%rbp), %r11
    movq    -88(%rbp), %r12
    movq    -96(%rbp), %r13
    movq    -104(%rbp), %r14
    movq    -112(%rbp), %rax

    movapd  -128(%rbp), %xmm0
    movapd  -144(%rbp), %xmm1
    movapd  -160(%rbp), %xmm2
    movapd  -176(%rbp), %xmm3
    movapd  -192(%rbp), %xmm4
    movapd  -208(%rbp), %xmm5
    movapd  -224(%rbp), %xmm6
    movapd  -240(%rbp), %xmm7
    movapd  -256(%rbp), %xmm8
    movapd  -272(%rbp), %xmm9
    movapd  -288(%rbp), %xmm10
    movapd  -304(%rbp), %xmm11
    movapd  -320(%rbp), %xmm12
    movapd  -336(%rbp), %xmm13
    movapd  -352(%rbp), %xmm14
    movapd  -368(%rbp), %xmm15

    popq    %rbp
    retq
    .seh_endproc