| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- From 05154174b369505238b759cf80d595d8cfc8c731 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(-)
- diff --git a/libgcc/config/xtensa/lib2funcs.S b/libgcc/config/xtensa/lib2funcs.S
- index 3ac8c1d..2e678af 100644
- --- a/libgcc/config/xtensa/lib2funcs.S
- +++ b/libgcc/config/xtensa/lib2funcs.S
- @@ -33,10 +33,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
- - 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
-
-
- @@ -58,10 +77,7 @@ __xtensa_nonlocal_goto:
- 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
- --
- 1.8.1.4
|