summaryrefslogtreecommitdiff
path: root/packages/gcc/5.5.0/0015-xtensa-reimplement-register-spilling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/gcc/5.5.0/0015-xtensa-reimplement-register-spilling.patch')
-rw-r--r--packages/gcc/5.5.0/0015-xtensa-reimplement-register-spilling.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/packages/gcc/5.5.0/0015-xtensa-reimplement-register-spilling.patch b/packages/gcc/5.5.0/0015-xtensa-reimplement-register-spilling.patch
new file mode 100644
index 0000000..b85ecb9
--- /dev/null
+++ b/packages/gcc/5.5.0/0015-xtensa-reimplement-register-spilling.patch
@@ -0,0 +1,71 @@
+From 40507bf199440082ed69b777986d50c31efe2520 Mon Sep 17 00:00:00 2001
+From: Max Filippov <jcmvbkbc@gmail.com>
+Date: Mon, 10 Aug 2015 21:35:20 +0300
+Subject: [PATCH 1/3] xtensa: reimplement register spilling
+
+Spilling windowed registers in userspace is much easier, more portable,
+less error-prone and equally effective as in kernel. Now that register
+spilling syscall is considered obsolete in the xtensa linux kernel
+replace it with CALL12 followed by series of ENTRY in libgcc.
+
+2015-08-18 Max Filippov <jcmvbkbc@gmail.com>
+libgcc/
+ * config/xtensa/lib2funcs.S (__xtensa_libgcc_window_spill): Use
+ CALL12 followed by series of ENTRY to spill windowed registers.
+ (__xtensa_nonlocal_goto): Call __xtensa_libgcc_window_spill
+ instead of making linux spill syscall.
+
+Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
+---
+Backported from: r226962
+
+ libgcc/config/xtensa/lib2funcs.S | 30 +++++++++++++++++++++++-------
+ 1 file changed, 23 insertions(+), 7 deletions(-)
+
+--- a/libgcc/config/xtensa/lib2funcs.S
++++ b/libgcc/config/xtensa/lib2funcs.S
+@@ -34,10 +34,29 @@
+ .global __xtensa_libgcc_window_spill
+ .type __xtensa_libgcc_window_spill,@function
+ __xtensa_libgcc_window_spill:
+- entry sp, 32
+- movi a2, 0
+- syscall
++ entry sp, 48
++#if XCHAL_NUM_AREGS > 16
++ call12 1f
++ retw
++ .align 4
++1:
++ .rept (XCHAL_NUM_AREGS - 24) / 12
++ _entry sp, 48
++ mov a12, a0
++ .endr
++ _entry sp, 16
++#if XCHAL_NUM_AREGS % 12 == 0
++ mov a4, a4
++#elif XCHAL_NUM_AREGS % 12 == 4
++ mov a8, a8
++#elif XCHAL_NUM_AREGS % 12 == 8
++ mov a12, a12
++#endif
++ retw
++#else
++ mov a8, a8
+ retw
++#endif
+ .size __xtensa_libgcc_window_spill, .-__xtensa_libgcc_window_spill
+ #endif
+
+@@ -61,10 +80,7 @@
+ entry sp, 32
+
+ /* Flush registers. */
+- mov a5, a2
+- movi a2, 0
+- syscall
+- mov a2, a5
++ call8 __xtensa_libgcc_window_spill
+
+ /* Because the save area for a0-a3 is stored one frame below
+ the one identified by a2, the only way to restore those