#if defined(_M_X64) || defined(__x86_64__) /* HOST_ARCH_X64 */ .intel_syntax noprefix .text #if defined(__linux__) || defined(__FreeBSD__) /* HOST_OS_LINUX */ .globl ClobberAndCall .type ClobberAndCall, @function ClobberAndCall: #else /* HOST_OS_MACOS */ .globl _ClobberAndCall _ClobberAndCall: #endif /* Clobber some significant registers and call the nullary function which is passed in as the first argument. */ /* Pool pointer register. */ push r15 mov r15, 1 /* Thread register. */ push r14 mov r14, 1 /* Code register. */ push r12 mov r12, 1 /* Arguments descriptor register. */ push r10 mov r10, 1 call rdi pop r10 pop r12 pop r14 pop r15 ret #elif defined(_M_IX86) || defined(__i386__) /* HOST_ARCH_IA32 */ #elif defined(__aarch64__) /* HOST_ARCH_ARM64 */ .text .global ClobberAndCall .type ClobberAndCall, %function ClobberAndCall: /* Save link register register and thread register. */ stp lr, x26, [sp, #-16]! mov lr, #1 mov x26, #1 /* Arguments descriptor register isn't callee-saved. */ mov x4, #1 /* Pool pointer register and code register. */ stp x24, x27, [sp, #-16]! mov x24, #1 mov x27, #1 blr x0 ldp x24, x27, [sp], #16 ldp lr, x26, [sp], #16 blr lr #elif defined(__ARMEL__) /* HOST_ARCH_ARM */ .text .global ClobberAndCall .type ClobberAndCall, %function ClobberAndCall: stmdb sp!,{r4, r5, r6, r10, lr} /* Arguments descriptor register. */ mov r4, #1 /* Pool pointer register. */ mov r5, #1 /* Code pointer register. */ mov r6, #1 /* Thread register. */ mov r10, #1 blx r0 ldm sp!,{r4, r5, r6, r10, pc} #endif