78 lines · 1.2 KB · Assembly
RawDownload
#ifdef __APPLE__#define EXT(s) _ ## s#else#define EXT(s) s#endif #ifdef i386 .globl EXT(setlabel)EXT(setlabel):	movl	4(%esp), %eax		movl %ebp, 0(%eax)	movl %ebx, 8(%eax)	movl %esi, 16(%eax)	movl %edi, 24(%eax)	movl %esp, 32(%eax) 	movl 0(%esp), %ecx	movl %ecx, 40(%eax)		movl $0, %eax	ret .globl EXT(gotolabel)EXT(gotolabel):	movl	4(%esp), %eax		movl 0(%eax), %ebp	movl 8(%eax), %ebx	movl 16(%eax), %esi	movl 24(%eax), %edi	movl 32(%eax), %esp		movl 40(%eax), %ecx	movl %ecx, 0(%esp)		movl $1, %eax	ret #else // first param is %rdi// need to save %rbp, %rbx, %rsp, %rip, %r12-%r15.// %rsi and %rdi are not callee-save, unlike i386. .globl EXT(setlabel)EXT(setlabel):	movq %rbp, 0(%rdi)	movq %rbx, 8(%rdi)	// 16(%rdi) is saved si (not used)	// 24(%rdi) is saved di (not used)	movq %rsp, 32(%rdi)	movq 0(%rsp), %rax	movq %rax, 40(%rdi)	// %rip	movq %r12, 48(%rdi)	movq %r13, 56(%rdi)	movq %r14, 64(%rdi)	movq %r15, 72(%rdi)	movq $0, %rax	ret .globl EXT(gotolabel)EXT(gotolabel):	movq 0(%rdi), %rbp	movq 8(%rdi), %rbx	movq 32(%rdi), %rsp	movq 40(%rdi), %rax	movq %rax, 0(%rsp)	// %rip	movq 48(%rdi), %r12	movq 56(%rdi), %r13	movq 64(%rdi), %r14	movq 72(%rdi), %r15	movq $1, %rax	cld	ret #endif