Author: Armin Rigo <[email protected]>
Branch:
Changeset: r80530:a1282c2b5668
Date: 2015-11-03 22:58 +0100
http://bitbucket.org/pypy/pypy/changeset/a1282c2b5668/
Log: Pull request #349 plus tweaks: Implementation of slp_switch for PPC
diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -76,10 +76,10 @@
if "cppyy" in working_modules:
working_modules.remove("cppyy") # depends on ctypes
-if sys.platform.startswith("linux"):
- _mach = os.popen('uname -m', 'r').read().strip()
- if _mach.startswith('ppc'):
- working_modules.remove("_continuation")
+#if sys.platform.startswith("linux"):
+# _mach = os.popen('uname -m', 'r').read().strip()
+# if _mach.startswith(...):
+# working_modules.remove("_continuation")
module_dependencies = {
diff --git a/rpython/rlib/test/test_rstacklet.py
b/rpython/rlib/test/test_rstacklet.py
--- a/rpython/rlib/test/test_rstacklet.py
+++ b/rpython/rlib/test/test_rstacklet.py
@@ -7,6 +7,7 @@
except CompilationError, e:
py.test.skip("cannot import rstacklet: %s" % e)
+from rpython.config.translationoption import DEFL_ROOTFINDER_WITHJIT
from rpython.rlib import rrandom, rgc
from rpython.rlib.rarithmetic import intmask
from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
@@ -289,6 +290,9 @@
class BaseTestStacklet(StandaloneTests):
def setup_class(cls):
+ if cls.gcrootfinder == "asmgcc" and DEFL_ROOTFINDER_WITHJIT !=
"asmgcc":
+ py.test.skip("asmgcc is disabled on the current platform")
+
from rpython.config.translationoption import
get_combined_translation_config
config = get_combined_translation_config(translating=True)
config.translation.gc = cls.gc
@@ -300,8 +304,6 @@
cls.old_values = Runner.config, Runner.STATUSMAX
Runner.config = config
Runner.STATUSMAX = 25000
- if cls.gcrootfinder == "asmgcc" and sys.platform == "win32":
- py.test.skip("fails with asmgcc on win32")
def teardown_class(cls):
Runner.config, Runner.STATUSMAX = cls.old_values
diff --git a/rpython/translator/c/src/stacklet/slp_platformselect.h
b/rpython/translator/c/src/stacklet/slp_platformselect.h
--- a/rpython/translator/c/src/stacklet/slp_platformselect.h
+++ b/rpython/translator/c/src/stacklet/slp_platformselect.h
@@ -10,6 +10,8 @@
#include "switch_x86_gcc.h" /* gcc on X86 */
#elif defined(__GNUC__) && defined(__arm__)
#include "switch_arm_gcc.h" /* gcc on arm */
+#elif defined(__GNUC__) && defined(__PPC64__)
+#include "switch_ppc64_gcc.h" /* gcc on ppc64 */
#elif defined(__GNUC__) && defined(__mips__) && defined(_ABI64)
#include "switch_mips64_gcc.h" /* gcc on mips64 */
#else
diff --git a/rpython/translator/c/src/stacklet/switch_ppc64_gcc.h
b/rpython/translator/c/src/stacklet/switch_ppc64_gcc.h
new file mode 100644
--- /dev/null
+++ b/rpython/translator/c/src/stacklet/switch_ppc64_gcc.h
@@ -0,0 +1,233 @@
+#if !(defined(__LITTLE_ENDIAN__) ^ defined(__BIG_ENDIAN__))
+# error "cannot determine if it is ppc64 or ppc64le"
+#endif
+
+#ifdef __BIG_ENDIAN__
+# define TOC_AREA "40"
+#else
+# define TOC_AREA "24"
+#endif
+
+
+/* This depends on these attributes so that gcc generates a function
+ with no code before the asm, and only "blr" after. */
+static __attribute__((noinline, optimize("O2")))
+void *slp_switch(void *(*save_state)(void*, void*),
+ void *(*restore_state)(void*, void*),
+ void *extra)
+{
+ void *result;
+ __asm__ volatile (
+ /* By Vaibhav Sood & Armin Rigo, with some copying from
+ the Stackless version by Kristjan Valur Jonsson */
+
+ /* Save all 18 volatile GP registers, 18 volatile FP regs, and 12
+ volatile vector regs. We need a stack frame of 144 bytes for FPR,
+ 144 bytes for GPR, 192 bytes for VR plus 48 bytes for the standard
+ stackframe = 528 bytes (a multiple of 16). */
+
+ "mflr 0\n" /* Save LR into 16(r1) */
+ "std 0, 16(1)\n"
+
+ "std 14,-288(1)\n" /* the GPR save area is between -288(r1) */
+ "std 15,-280(1)\n" /* included and -144(r1) excluded */
+ "std 16,-272(1)\n"
+ "std 17,-264(1)\n"
+ "std 18,-256(1)\n"
+ "std 19,-248(1)\n"
+ "std 20,-240(1)\n"
+ "std 21,-232(1)\n"
+ "std 22,-224(1)\n"
+ "std 23,-216(1)\n"
+ "std 24,-208(1)\n"
+ "std 25,-200(1)\n"
+ "std 26,-192(1)\n"
+ "std 27,-184(1)\n"
+ "std 28,-176(1)\n"
+ "std 29,-168(1)\n"
+ "std 30,-160(1)\n"
+ "std 31,-152(1)\n"
+
+ "stfd 14,-144(1)\n" /* the FPR save area is between -144(r1) */
+ "stfd 15,-136(1)\n" /* included and 0(r1) excluded */
+ "stfd 16,-128(1)\n"
+ "stfd 17,-120(1)\n"
+ "stfd 18,-112(1)\n"
+ "stfd 19,-104(1)\n"
+ "stfd 20,-96(1)\n"
+ "stfd 21,-88(1)\n"
+ "stfd 22,-80(1)\n"
+ "stfd 23,-72(1)\n"
+ "stfd 24,-64(1)\n"
+ "stfd 25,-56(1)\n"
+ "stfd 26,-48(1)\n"
+ "stfd 27,-40(1)\n"
+ "stfd 28,-32(1)\n"
+ "stfd 29,-24(1)\n"
+ "stfd 30,-16(1)\n"
+ "stfd 31,-8(1)\n"
+
+ "li 12,-480\n" /* the VR save area is between -480(r1) */
+ "stvx 20,12,1\n" /* included and -288(r1) excluded */
+ "li 12,-464\n"
+ "stvx 21,12,1\n"
+ "li 12,-448\n"
+ "stvx 22,12,1\n"
+ "li 12,-432\n"
+ "stvx 23,12,1\n"
+ "li 12,-416\n"
+ "stvx 24,12,1\n"
+ "li 12,-400\n"
+ "stvx 25,12,1\n"
+ "li 12,-384\n"
+ "stvx 26,12,1\n"
+ "li 12,-368\n"
+ "stvx 27,12,1\n"
+ "li 12,-352\n"
+ "stvx 28,12,1\n"
+ "li 12,-336\n"
+ "stvx 29,12,1\n"
+ "li 12,-320\n"
+ "stvx 30,12,1\n"
+ "li 12,-304\n"
+ "stvx 31,12,1\n"
+
+ "stdu 1,-528(1)\n" /* Create stack frame */
+
+ "std 2, "TOC_AREA"(1)\n" /* Save TOC in the "TOC save area"*/
+ "mfcr 12\n" /* Save CR in the "CR save area" */
+ "std 12, 8(1)\n"
+
+ "mr 14, %[restore_state]\n" /* save 'restore_state' for later */
+ "mr 15, %[extra]\n" /* save 'extra' for later */
+ "mr 12, %[save_state]\n" /* move 'save_state' into r12 for branching */
+ "mr 3, 1\n" /* arg 1: current (old) stack pointer */
+ "mr 4, 15\n" /* arg 2: extra */
+
+ "stdu 1, -48(1)\n" /* create temp stack space (see below) */
+#ifdef __BIG_ENDIAN__
+ "ld 0, 0(12)\n"
+ "ld 11, 16(12)\n"
+ "mtctr 0\n"
+ "ld 2, 8(12)\n"
+#else
+ "mtctr 12\n" /* r12 is fixed by this ABI */
+#endif
+ "bctrl\n" /* call save_state() */
+ "addi 1, 1, 48\n" /* destroy temp stack space */
+
+ "cmpdi 3, 0\n" /* skip the rest if the return value is null */
+ "bt eq, zero\n"
+
+ "mr 1, 3\n" /* change the stack pointer */
+ /* From now on, the stack pointer is modified, but the content of the
+ stack is not restored yet. It contains only garbage here. */
+
+ "mr 4, 15\n" /* arg 2: extra */
+ /* arg 1: current (new) stack pointer
+ is already in r3 */
+
+ "stdu 1, -48(1)\n" /* create temp stack space for callee to use */
+ /* ^^^ we have to be careful. The function call will store the link
+ register in the current frame (as the ABI) dictates. But it will
+ then trample it with the restore! We fix this by creating a fake
+ stack frame */
+
+#ifdef __BIG_ENDIAN__
+ "ld 0, 0(14)\n" /* 'restore_state' is in r14 */
+ "ld 11, 16(14)\n"
+ "mtctr 0\n"
+ "ld 2, 8(14)\n"
+#endif
+#ifdef __LITTLE_ENDIAN__
+ "mr 12, 14\n" /* copy 'restore_state' */
+ "mtctr 12\n" /* r12 is fixed by this ABI */
+#endif
+
+ "bctrl\n" /* call restore_state() */
+ "addi 1, 1, 48\n" /* destroy temp stack space */
+
+ /* The stack's content is now restored. */
+
+ "zero:\n"
+
+ /* Epilogue */
+
+ "ld 2, "TOC_AREA"(1)\n" /* restore the TOC */
+ "ld 12,8(1)\n" /* restore the condition register */
+ "mtcrf 0xff, 12\n"
+
+ "addi 1,1,528\n" /* restore stack pointer */
+
+ "li 12,-480\n" /* restore vector registers */
+ "lvx 20,12,1\n"
+ "li 12,-464\n"
+ "lvx 21,12,1\n"
+ "li 12,-448\n"
+ "lvx 22,12,1\n"
+ "li 12,-432\n"
+ "lvx 23,12,1\n"
+ "li 12,-416\n"
+ "lvx 24,12,1\n"
+ "li 12,-400\n"
+ "lvx 25,12,1\n"
+ "li 12,-384\n"
+ "lvx 26,12,1\n"
+ "li 12,-368\n"
+ "lvx 27,12,1\n"
+ "li 12,-352\n"
+ "lvx 28,12,1\n"
+ "li 12,-336\n"
+ "lvx 29,12,1\n"
+ "li 12,-320\n"
+ "lvx 30,12,1\n"
+ "li 12,-304\n"
+ "lvx 31,12,1\n"
+
+ "ld 14,-288(1)\n" /* restore general purporse registers */
+ "ld 15,-280(1)\n"
+ "ld 16,-272(1)\n"
+ "ld 17,-264(1)\n"
+ "ld 18,-256(1)\n"
+ "ld 19,-248(1)\n"
+ "ld 20,-240(1)\n"
+ "ld 21,-232(1)\n"
+ "ld 22,-224(1)\n"
+ "ld 23,-216(1)\n"
+ "ld 24,-208(1)\n"
+ "ld 25,-200(1)\n"
+ "ld 26,-192(1)\n"
+ "ld 27,-184(1)\n"
+ "ld 28,-176(1)\n"
+ "ld 29,-168(1)\n"
+ "ld 30,-160(1)\n"
+ "ld 31,-152(1)\n"
+
+ "lfd 14,-144(1)\n" /* restore floating point registers */
+ "lfd 15,-136(1)\n"
+ "lfd 16,-128(1)\n"
+ "lfd 17,-120(1)\n"
+ "lfd 18,-112(1)\n"
+ "lfd 19,-104(1)\n"
+ "lfd 20,-96(1)\n"
+ "lfd 21,-88(1)\n"
+ "lfd 22,-80(1)\n"
+ "lfd 23,-72(1)\n"
+ "lfd 24,-64(1)\n"
+ "lfd 25,-56(1)\n"
+ "lfd 26,-48(1)\n"
+ "lfd 27,-40(1)\n"
+ "lfd 28,-32(1)\n"
+ "ld 0, 16(1)\n"
+ "lfd 29,-24(1)\n"
+ "mtlr 0\n"
+ "lfd 30,-16(1)\n"
+ "lfd 31,-8(1)\n"
+
+ : "=r"(result) /* output variable: expected to be r3 */
+ : [restore_state]"r"(restore_state), /* input variables */
+ [save_state]"r"(save_state),
+ [extra]"r"(extra)
+ );
+ return result;
+}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit