From efd732b03504ee9574b1a06a27635ec7e2e0717b Mon Sep 17 00:00:00 2001 From: arigo Date: Mon, 14 Jan 2008 10:38:23 +0100 Subject: [PATCH] [svn r50576] This patch by Thiemo Seufer adds support for mips and mipsel. --HG-- branch : trunk --- py/c-extension/greenlet/slp_platformselect.h | 2 + py/c-extension/greenlet/switch_mips_unix.h | 56 ++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 py/c-extension/greenlet/switch_mips_unix.h diff --git a/py/c-extension/greenlet/slp_platformselect.h b/py/c-extension/greenlet/slp_platformselect.h index 078087e2c..c19bb0632 100644 --- a/py/c-extension/greenlet/slp_platformselect.h +++ b/py/c-extension/greenlet/slp_platformselect.h @@ -18,4 +18,6 @@ #include "switch_s390_unix.h" /* Linux/S390 */ #elif defined(__GNUC__) && defined(__s390x__) && defined(__linux__) #include "switch_s390_unix.h" /* Linux/S390 zSeries (identical) */ +#elif defined(__GNUC__) && defined(__mips__) && defined(__linux__) +#include "switch_mips_unix.h" /* Linux/MIPS */ #endif diff --git a/py/c-extension/greenlet/switch_mips_unix.h b/py/c-extension/greenlet/switch_mips_unix.h new file mode 100644 index 000000000..94b548917 --- /dev/null +++ b/py/c-extension/greenlet/switch_mips_unix.h @@ -0,0 +1,56 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 05-Jan-08 Thiemo Seufer + * Ported from ppc. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +#ifdef __mips64 +#define REGS_TO_SAVE "$16", "$17", "$18", "$19", "$20", "$21", "$22", \ + "$23", "$28", "$30" +#else +#define REGS_TO_SAVE "$16", "$17", "$18", "$19", "$20", "$21", "$22", \ + "$23", "$30" +#endif +static int +slp_switch(void) +{ + register int *stackref, stsizediff; + __asm__ __volatile__ ("" : : : REGS_TO_SAVE); + __asm__ ("move %0, $29" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ __volatile__ ( +#ifdef __mips64 + "daddu $29, %0\n" +#else + "addu $29, %0\n" +#endif + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ __volatile__ ("" : : : REGS_TO_SAVE); + return 0; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */