// 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 cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off
#define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off
#define cfi_restore(reg) .cfi_restore reg
#define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg
#define SignalStubFrameSize (0xE0)
// for arm32, do stack check and try to throw StackOverFlow Expection.
.text
.align 2
.global CJ_MCC_StackGrowStub
.type CJ_MCC_StackGrowStub, %function
CJ_MCC_StackGrowStub:
.cfi_startproc
sub sp, sp, # SignalStubFrameSize
cfi_adjust_cfa_offset (SignalStubFrameSize)
str r1, [sp, #0]
cfi_rel_offset (r1, 0)
str r2, [sp, #4]
cfi_rel_offset (r2, 4)
str r3, [sp, #8]
cfi_rel_offset (r3, 8)
str r12, [sp, #12]
cfi_rel_offset (r12, 12)
str lr, [sp, #16]
cfi_rel_offset (lr, 16)
vstr d0, [sp, #20]
cfi_rel_offset (d0, 20)
vstr d1, [sp, #28]
cfi_rel_offset (d1, 28)
vstr d2, [sp, #36]
cfi_rel_offset (d2, 36)
vstr d3, [sp, #44]
cfi_rel_offset (d3, 44)
vstr d4, [sp, #52]
cfi_rel_offset (d4, 52)
vstr d5, [sp, #60]
cfi_rel_offset (d5, 60)
vstr d6, [sp, #68]
cfi_rel_offset (d6, 68)
vstr d7, [sp, #76]
cfi_rel_offset (d7, 76)
vstr d16, [sp, #84]
cfi_rel_offset (d16, 84)
vstr d17, [sp, #92]
cfi_rel_offset (d17, 92)
vstr d18, [sp, #100]
cfi_rel_offset (d18, 100)
vstr d19, [sp, #108]
cfi_rel_offset (d19, 108)
vstr d20, [sp, #116]
cfi_rel_offset (d20, 116)
vstr d21, [sp, #124]
cfi_rel_offset (d21, 124)
vstr d22, [sp, #132]
cfi_rel_offset (d22, 132)
vstr d23, [sp, #140]
cfi_rel_offset (d23, 140)
vstr d24, [sp, #148]
cfi_rel_offset (d24, 148)
vstr d25, [sp, #156]
cfi_rel_offset (d25, 156)
vstr d26, [sp, #164]
cfi_rel_offset (d26, 164)
vstr d27, [sp, #172]
cfi_rel_offset (d27, 172)
vstr d28, [sp, #180]
cfi_rel_offset (d28, 180)
vstr d29, [sp, #188]
cfi_rel_offset (d29, 188)
vstr d30, [sp, #196]
cfi_rel_offset (d30, 196)
vstr d31, [sp, #204]
cfi_rel_offset (d31, 204)
mov r0, sp
mov r1, #0
mov r2, lr
bl MRT_StackGrow
.global unwindPCForStackGrowStub
unwindPCForStackGrowStub:
vldr d31, [sp, #204]
cfi_restore(d31)
vldr d30, [sp, #196]
cfi_restore(d30)
vldr d29, [sp, #188]
cfi_restore(d29)
vldr d28, [sp, #180]
cfi_restore(d28)
vldr d27, [sp, #172]
cfi_restore(d27)
vldr d26, [sp, #164]
cfi_restore(d26)
vldr d25, [sp, #156]
cfi_restore(d25)
vldr d24, [sp, #148]
cfi_restore(d24)
vldr d23, [sp, #140]
cfi_restore(d23)
vldr d22, [sp, #132]
cfi_restore(d22)
vldr d21, [sp, #124]
cfi_restore(d21)
vldr d20, [sp, #116]
cfi_restore(d20)
vldr d19, [sp, #108]
cfi_restore(d19)
vldr d18, [sp, #100]
cfi_restore(d18)
vldr d17, [sp, #92]
cfi_restore(d17)
vldr d16, [sp, #84]
cfi_restore(d16)
vldr d7, [sp, #76]
cfi_restore(d7)
vldr d6, [sp, #68]
cfi_restore(d6)
vldr d5, [sp, #60]
cfi_restore(d5)
vldr d4, [sp, #52]
cfi_restore(d4)
vldr d3, [sp, #44]
cfi_restore(d3)
vldr d2, [sp, #36]
cfi_restore(d2)
vldr d1, [sp, #28]
cfi_restore(d1)
vldr d0, [sp, #20]
cfi_restore(d0)
ldr lr, [sp, #16]
cfi_restore(lr)
ldr r12, [sp, #12]
cfi_restore(r12)
ldr r3, [sp, #8]
cfi_restore(r3)
ldr r2, [sp, #4]
cfi_restore(r2)
ldr r1, [sp, #0]
cfi_restore(r1)
add sp, sp, # SignalStubFrameSize
cfi_adjust_cfa_offset (-SignalStubFrameSize)
bx lr
.cfi_endproc
.size CJ_MCC_StackGrowStub, .-CJ_MCC_StackGrowStub