#define APHELEIA_SETJMP_NO_MACRO #include // clang-format off #if defined(__riscv) && __riscv_xlen == 64 __asm__( ".globl setjmp\n" "setjmp:\n" "sd ra, 0(a0)\n" "sd s0, 8(a0)\n" "sd s1, 16(a0)\n" "sd s2, 24(a0)\n" "sd s3, 32(a0)\n" "sd s4, 40(a0)\n" "sd s5, 48(a0)\n" "sd s6, 56(a0)\n" "sd s7, 64(a0)\n" "sd s8, 72(a0)\n" "sd s9, 80(a0)\n" "sd s10, 88(a0)\n" "sd s11, 96(a0)\n" "sd sp, 104(a0)\n" "li a0, 0\n" "ret\n" "\n" ".globl longjmp\n" "longjmp:\n" "mv t0, a0\n" "mv t1, a1\n" "bnez t1, 0f\n" "li t1, 1\n" "0:\n" "ld ra, 0(t0)\n" "ld s0, 8(t0)\n" "ld s1, 16(t0)\n" "ld s2, 24(t0)\n" "ld s3, 32(t0)\n" "ld s4, 40(t0)\n" "ld s5, 48(t0)\n" "ld s6, 56(t0)\n" "ld s7, 64(t0)\n" "ld s8, 72(t0)\n" "ld s9, 80(t0)\n" "ld s10, 88(t0)\n" "ld s11, 96(t0)\n" "ld sp, 104(t0)\n" "mv a0, t1\n" "jr ra\n" ); #elif defined(__riscv) && __riscv_xlen == 32 __asm__( ".globl setjmp\n" "setjmp:\n" "sw ra, 0(a0)\n" "sw s0, 4(a0)\n" "sw s1, 8(a0)\n" "sw s2, 12(a0)\n" "sw s3, 16(a0)\n" "sw s4, 20(a0)\n" "sw s5, 24(a0)\n" "sw s6, 28(a0)\n" "sw s7, 32(a0)\n" "sw s8, 36(a0)\n" "sw s9, 40(a0)\n" "sw s10, 44(a0)\n" "sw s11, 48(a0)\n" "sw sp, 52(a0)\n" "li a0, 0\n" "ret\n" "\n" ".globl longjmp\n" "longjmp:\n" "mv t0, a0\n" "mv t1, a1\n" "bnez t1, 0f\n" "li t1, 1\n" "0:\n" "lw ra, 0(t0)\n" "lw s0, 4(t0)\n" "lw s1, 8(t0)\n" "lw s2, 12(t0)\n" "lw s3, 16(t0)\n" "lw s4, 20(t0)\n" "lw s5, 24(t0)\n" "lw s6, 28(t0)\n" "lw s7, 32(t0)\n" "lw s8, 36(t0)\n" "lw s9, 40(t0)\n" "lw s10, 44(t0)\n" "lw s11, 48(t0)\n" "lw sp, 52(t0)\n" "mv a0, t1\n" "jr ra\n" ); #elif defined(__x86_64__) __asm__( ".globl setjmp\n" "setjmp:\n" "movq %rbx, 0(%rdi)\n" "movq %rbp, 8(%rdi)\n" "movq %r12, 16(%rdi)\n" "movq %r13, 24(%rdi)\n" "movq %r14, 32(%rdi)\n" "movq %r15, 40(%rdi)\n" "movq (%rsp), %rax\n" "movq %rax, 48(%rdi)\n" "leaq 8(%rsp), %rax\n" "movq %rax, 56(%rdi)\n" "xorl %eax, %eax\n" "ret\n" "\n" ".globl longjmp\n" "longjmp:\n" "movq %rdi, %rdx\n" "movl %esi, %eax\n" "testl %eax, %eax\n" "jnz 0f\n" "movl $1, %eax\n" "0:\n" "movq 0(%rdx), %rbx\n" "movq 8(%rdx), %rbp\n" "movq 16(%rdx), %r12\n" "movq 24(%rdx), %r13\n" "movq 32(%rdx), %r14\n" "movq 40(%rdx), %r15\n" "movq 56(%rdx), %rsp\n" "jmp *48(%rdx)\n" ); #elif defined(__i386__) __asm__( ".globl setjmp\n" "setjmp:\n" "movl 4(%esp), %edx\n" "movl %ebx, 0(%edx)\n" "movl %esi, 4(%edx)\n" "movl %edi, 8(%edx)\n" "movl %ebp, 12(%edx)\n" "movl (%esp), %eax\n" "movl %eax, 16(%edx)\n" "leal 4(%esp), %eax\n" "movl %eax, 20(%edx)\n" "xorl %eax, %eax\n" "ret\n" "\n" ".globl longjmp\n" "longjmp:\n" "movl 4(%esp), %edx\n" "movl 8(%esp), %eax\n" "testl %eax, %eax\n" "jnz 0f\n" "movl $1, %eax\n" "0:\n" "movl 0(%edx), %ebx\n" "movl 4(%edx), %esi\n" "movl 8(%edx), %edi\n" "movl 12(%edx), %ebp\n" "movl 20(%edx), %esp\n" "jmp *16(%edx)\n" ); #else #error "Unsupported architecture" #endif // clang-format on