Qucs-S S-parameter Viewer & RF Synthesis Tools
Loading...
Searching...
No Matches
switch_sh_gcc.h
1#define STACK_REFPLUS 1
2
3#ifdef SLP_EVAL
4#define STACK_MAGIC 0
5#define REGS_TO_SAVE "r8", "r9", "r10", "r11", "r13", \
6 "fr12", "fr13", "fr14", "fr15"
7
8// r12 Global context pointer, GP
9// r14 Frame pointer, FP
10// r15 Stack pointer, SP
11
12static int
13slp_switch(void)
14{
15 int err;
16 void* fp;
17 int *stackref, stsizediff;
18 __asm__ volatile("" : : : REGS_TO_SAVE);
19 __asm__ volatile("mov.l r14, %0" : "=m"(fp) : :);
20 __asm__("mov r15, %0" : "=r"(stackref));
21 {
22 SLP_SAVE_STATE(stackref, stsizediff);
23 __asm__ volatile(
24 "add %0, r15\n"
25 "add %0, r14\n"
26 : /* no outputs */
27 : "r"(stsizediff));
28 SLP_RESTORE_STATE();
29 __asm__ volatile("mov r0, %0" : "=r"(err) : :);
30 }
31 __asm__ volatile("mov.l %0, r14" : : "m"(fp) :);
32 __asm__ volatile("" : : : REGS_TO_SAVE);
33 return err;
34}
35
36#endif