| 1 | /** |
| 2 | * This file has no copyright assigned and is placed in the Public Domain. |
| 3 | * This file is part of the mingw-w64 runtime package. |
| 4 | * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| 5 | */ |
| 6 | #include <_mingw_mac.h> |
| 7 | |
| 8 | #if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) |
| 9 | 	.globl __MINGW_USYMBOL(__mingw_setjmp) |
| 10 | 	.def	__MINGW_USYMBOL(__mingw_setjmp);	.scl	2;	.type	32;	.endef |
| 11 | __MINGW_USYMBOL(__mingw_setjmp): |
| 12 | #if defined(_ARM_) || defined(__arm__) |
| 13 | 	mov r1, #0 |
| 14 | 	str r1, [r0] /* jmp_buf->Frame */ |
| 15 | 	str r4, [r0, #0x4] /* jmp_buf->R4 */ |
| 16 | 	str r5, [r0, #0x8] /* jmp_buf->R5 */ |
| 17 | 	str r6, [r0, #0xc] /* jmp_buf->R6 */ |
| 18 | 	str r7, [r0, #0x10] /* jmp_buf->R7 */ |
| 19 | 	str r8, [r0, #0x14] /* jmp_buf->R8 */ |
| 20 | 	str r9, [r0, #0x18] /* jmp_buf->R9 */ |
| 21 | 	str r10, [r0, #0x1c] /* jmp_buf->R10 */ |
| 22 | 	str r11, [r0, #0x20] /* jmp_buf->R11 */ |
| 23 | 	str sp, [r0, #0x24] /* jmp_buf->Sp */ |
| 24 | 	str lr, [r0, #0x28] /* jmp_buf->Pc */ |
| 25 | 	vmrs r2, fpscr |
| 26 | 	str r2, [r0, #0x2c] /* jmp_buf->Fpscr */ |
| 27 | 	vstr d8, [r0, #0x30] /* jmp_buf->D[0] */ |
| 28 | 	vstr d9, [r0, #0x38] /* jmp_buf->D[1] */ |
| 29 | 	vstr d10, [r0, #0x40] /* jmp_buf->D[2] */ |
| 30 | 	vstr d11, [r0, #0x48] /* jmp_buf->D[3] */ |
| 31 | 	vstr d12, [r0, #0x50] /* jmp_buf->D[4] */ |
| 32 | 	vstr d13, [r0, #0x58] /* jmp_buf->D[5] */ |
| 33 | 	vstr d14, [r0, #0x60] /* jmp_buf->D[6] */ |
| 34 | 	vstr d15, [r0, #0x68] /* jmp_buf->D[7] */ |
| 35 | 	mov r0, #0 |
| 36 | 	bx lr |
| 37 | #elif defined(_ARM64_) || defined(__aarch64__) |
| 38 | 	str xzr, [x0] /* jmp_buf->Frame */ |
| 39 | 	stp x19, x20, [x0, #0x10] /* jmp_buf->X19, X20 */ |
| 40 | 	stp x21, x22, [x0, #0x20] /* jmp_buf->X21, X22 */ |
| 41 | 	stp x23, x24, [x0, #0x30] /* jmp_buf->X23, X24 */ |
| 42 | 	stp x25, x26, [x0, #0x40] /* jmp_buf->X25, X26 */ |
| 43 | 	stp x27, x28, [x0, #0x50] /* jmp_buf->X27, X28 */ |
| 44 | 	stp x29, x30, [x0, #0x60] /* jmp_buf->Fp, Lr */ |
| 45 | 	mov x2, sp |
| 46 | 	str x2, [x0, #0x70] /* jmp_buf->Sp */ |
| 47 | 	mrs x2, fpcr |
| 48 | 	str w2, [x0, #0x78] /* jmp_buf->Fpcr */ |
| 49 | 	mrs x2, fpsr |
| 50 | 	str w2, [x0, #0x7c] /* jmp_buf->Fpsr */ |
| 51 | 	stp d8, d9, [x0, #0x80] /* jmp_buf->D[0-1] */ |
| 52 | 	stp d10, d11, [x0, #0x90] /* jmp_buf->D[2-3] */ |
| 53 | 	stp d12, d13, [x0, #0xa0] /* jmp_buf->D[4-5] */ |
| 54 | 	stp d14, d15, [x0, #0xb0] /* jmp_buf->D[6-7] */ |
| 55 | 	mov x0, #0 |
| 56 | 	ret |
| 57 | #endif |
| 58 | |
| 59 | 	.globl __MINGW_USYMBOL(__mingw_longjmp) |
| 60 | 	.def	__MINGW_USYMBOL(__mingw_longjmp);	.scl	2;	.type	32;	.endef |
| 61 | __MINGW_USYMBOL(__mingw_longjmp): |
| 62 | #if defined(_ARM_) || defined(__arm__) |
| 63 | 	ldr r4, [r0, #0x4] /* jmp_buf->R4 */ |
| 64 | 	ldr r5, [r0, #0x8] /* jmp_buf->R5 */ |
| 65 | 	ldr r6, [r0, #0xc] /* jmp_buf->R6 */ |
| 66 | 	ldr r7, [r0, #0x10] /* jmp_buf->R7 */ |
| 67 | 	ldr r8, [r0, #0x14] /* jmp_buf->R8 */ |
| 68 | 	ldr r9, [r0, #0x18] /* jmp_buf->R9 */ |
| 69 | 	ldr r10, [r0, #0x1c] /* jmp_buf->R10 */ |
| 70 | 	ldr r11, [r0, #0x20] /* jmp_buf->R11 */ |
| 71 | 	ldr sp, [r0, #0x24] /* jmp_buf->Sp */ |
| 72 | 	ldr r2, [r0, #0x28] /* jmp_buf->Pc */ |
| 73 | 	ldr r3, [r0, #0x2c] /* jmp_buf->Fpscr */ |
| 74 | 	vmsr fpscr, r3 |
| 75 | 	vldr d8, [r0, #0x30] /* jmp_buf->D[0] */ |
| 76 | 	vldr d9, [r0, #0x38] /* jmp_buf->D[1] */ |
| 77 | 	vldr d10, [r0, #0x40] /* jmp_buf->D[2] */ |
| 78 | 	vldr d11, [r0, #0x48] /* jmp_buf->D[3] */ |
| 79 | 	vldr d12, [r0, #0x50] /* jmp_buf->D[4] */ |
| 80 | 	vldr d13, [r0, #0x58] /* jmp_buf->D[5] */ |
| 81 | 	vldr d14, [r0, #0x60] /* jmp_buf->D[6] */ |
| 82 | 	vldr d15, [r0, #0x68] /* jmp_buf->D[7] */ |
| 83 | 	mov r0, r1 /* retval */ |
| 84 | 	bx r2 |
| 85 | #elif defined(_ARM64_) || defined(__aarch64__) |
| 86 | 	ldp x19, x20, [x0, #0x10] /* jmp_buf->X19, X20 */ |
| 87 | 	ldp x21, x22, [x0, #0x20] /* jmp_buf->X21, X22 */ |
| 88 | 	ldp x23, x24, [x0, #0x30] /* jmp_buf->X23, X24 */ |
| 89 | 	ldp x25, x26, [x0, #0x40] /* jmp_buf->X25, X26 */ |
| 90 | 	ldp x27, x28, [x0, #0x50] /* jmp_buf->X27, X28 */ |
| 91 | 	ldp x29, x30, [x0, #0x60] /* jmp_buf->Fp, Lr */ |
| 92 | 	ldr x2, [x0, #0x70] /* jmp_buf->Sp */ |
| 93 | 	mov sp, x2 |
| 94 | 	ldr w2, [x0, #0x78] /* jmp_buf->Fpcr */ |
| 95 | 	msr fpcr, x2 |
| 96 | 	ldr w2, [x0, #0x7c] /* jmp_buf->Fpsr */ |
| 97 | 	msr fpsr, x2 |
| 98 | 	ldp d8, d9, [x0, #0x80] /* jmp_buf->D[0-1] */ |
| 99 | 	ldp d10, d11, [x0, #0x90] /* jmp_buf->D[2-3] */ |
| 100 | 	ldp d12, d13, [x0, #0xa0] /* jmp_buf->D[4-5] */ |
| 101 | 	ldp d14, d15, [x0, #0xb0] /* jmp_buf->D[6-7] */ |
| 102 | 	mov x0, x1 /* retval */ |
| 103 | 	ret |
| 104 | #endif |
| 105 | #endif |