xref: /openbsd-src/regress/usr.bin/lastcomm/pivot.h (revision f03ebfd6f95010dde4f369e901a1ce4ac22a5a2a)
1190ee811Sbluhm #ifndef REGRESS_PIVOT_H
2190ee811Sbluhm #define REGRESS_PIVOT_H
3190ee811Sbluhm 
pivot(void * newstack)4190ee811Sbluhm static void pivot(void *newstack) {
5190ee811Sbluhm #if defined(__aarch64__)
6190ee811Sbluhm     asm("mov sp, %0; ldr lr, [sp]; ret;" ::"r"(newstack));
7190ee811Sbluhm #elif defined(__amd64__)
8190ee811Sbluhm     asm("mov %0, %%rsp; retq;" ::"r"(newstack));
9190ee811Sbluhm #elif defined(__i386__)
10190ee811Sbluhm     asm("mov %0, %%esp; retl;" ::"r"(newstack));
11190ee811Sbluhm #elif defined(__mips64__)
12190ee811Sbluhm     asm("move $sp, %0; ld $ra, 0($sp); jr $ra;" ::"r"(newstack));
13bd23ff4aSkettenis #elif defined(__powerpc64__)
14bd23ff4aSkettenis     asm("mr %%r1, %0; ld %%r3, 0(%%r1); mtlr %%r3; blr;" ::"r"(newstack));
15bd23ff4aSkettenis #elif defined(__powerpc__)
16bd23ff4aSkettenis     asm("mr %%r1, %0; lwz %%r3, 0(%%r1); mtlr %%r3; blr;" ::"r"(newstack));
17*f03ebfd6Sderaadt #elif defined(__riscv)
18*f03ebfd6Sderaadt     asm("mv sp, %0; ld ra, 0(sp); jr ra" ::"r"(newstack));
19190ee811Sbluhm #endif
20190ee811Sbluhm }
21190ee811Sbluhm 
22190ee811Sbluhm #endif
23