[PATCH 1/3] xtensa: reimplement register spilling

2015-08-17 Thread Max Filippov
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  jcmvb...@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.
---
 libgcc/config/xtensa/lib2funcs.S | 30 +++---
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/libgcc/config/xtensa/lib2funcs.S b/libgcc/config/xtensa/lib2funcs.S
index 4d451c8..ef0703f 100644
--- a/libgcc/config/xtensa/lib2funcs.S
+++ b/libgcc/config/xtensa/lib2funcs.S
@@ -34,10 +34,29 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
If not, see
.global __xtensa_libgcc_window_spill
.type   __xtensa_libgcc_window_spill,@function
 __xtensa_libgcc_window_spill:
-   entry   sp, 32
-   movia2, 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 @@ __xtensa_nonlocal_goto:
entry   sp, 32
 
/* Flush registers.  */
-   mov a5, a2
-   movia2, 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
-- 
1.8.1.4



Re: [PATCH 1/3] xtensa: reimplement register spilling

2015-08-17 Thread Max Filippov
On Tue, Aug 18, 2015 at 3:50 AM, augustine.sterl...@gmail.com
augustine.sterl...@gmail.com wrote:
 On Mon, Aug 17, 2015 at 2:59 PM, Max Filippov jcmvb...@gmail.com wrote:
 2015-08-18  Max Filippov  jcmvb...@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.

 Approved.

Applied whole series to trunk. Thank you!

-- Max


Re: [PATCH 1/3] xtensa: reimplement register spilling

2015-08-17 Thread augustine.sterl...@gmail.com
On Mon, Aug 17, 2015 at 2:59 PM, Max Filippov jcmvb...@gmail.com wrote:
 2015-08-18  Max Filippov  jcmvb...@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.

Approved.