1 #ifndef REGRESS_PIVOT_H 2 #define REGRESS_PIVOT_H 3 4 static void pivot(void *newstack) { 5 #if defined(__aarch64__) 6 asm("mov sp, %0; ldr lr, [sp]; ret;" ::"r"(newstack)); 7 #elif defined(__amd64__) 8 asm("mov %0, %%rsp; retq;" ::"r"(newstack)); 9 #elif defined(__i386__) 10 asm("mov %0, %%esp; retl;" ::"r"(newstack)); 11 #elif defined(__mips64__) 12 asm("move $sp, %0; ld $ra, 0($sp); jr $ra;" ::"r"(newstack)); 13 #elif defined(__powerpc64__) 14 asm("mr %%r1, %0; ld %%r3, 0(%%r1); mtlr %%r3; blr;" ::"r"(newstack)); 15 #elif defined(__powerpc__) 16 asm("mr %%r1, %0; lwz %%r3, 0(%%r1); mtlr %%r3; blr;" ::"r"(newstack)); 17 #endif 18 } 19 20 #endif 21