Author: Stefano Rivera <[email protected]>
Branch:
Changeset: r67161:f1e9c4f357e1
Date: 2013-10-06 09:49 +0200
http://bitbucket.org/pypy/pypy/changeset/f1e9c4f357e1/
Log: ARMv4 doesn't have BLX. Add support for older ARM
diff --git a/rpython/translator/c/src/stacklet/switch_arm_gcc.h
b/rpython/translator/c/src/stacklet/switch_arm_gcc.h
--- a/rpython/translator/c/src/stacklet/switch_arm_gcc.h
+++ b/rpython/translator/c/src/stacklet/switch_arm_gcc.h
@@ -1,3 +1,10 @@
+#if __ARM_ARCH__ >= 5
+# define call_reg(x) "blx " #x "\n"
+#elif defined (__ARM_ARCH_4T__)
+# define call_reg(x) "mov lr, pc ; bx " #x "\n"
+#else
+# define call_reg(x) "mov lr, pc ; mov pc, " #x "\n"
+#endif
static void __attribute__((optimize("O3"))) *slp_switch(void
*(*save_state)(void*, void*),
void *(*restore_state)(void*, void*),
@@ -11,7 +18,7 @@
"mov r5, %[extra]\n"
"mov r0, sp\n" /* arg 1: current (old) stack pointer */
"mov r1, r5\n" /* arg 2: extra */
- "blx r3\n" /* call save_state() */
+ call_reg(r3) /* call save_state() */
/* skip the rest if the return value is null */
"cmp r0, #0\n"
@@ -23,7 +30,7 @@
stack is not restored yet. It contains only garbage here. */
"mov r1, r5\n" /* arg 2: extra */
/* arg 1: current (new)
stack pointer is already in r0*/
- "blx r4\n" /* call restore_state() */
+ call_reg(r4) /* call restore_state() */
/* The stack's content is now restored. */
"zero:\n"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit