diff mbox

[1/3] xtensa: reimplement register spilling

Message ID 1439848790-3488-2-git-send-email-jcmvbkbc@gmail.com
State New
Headers show

Commit Message

Max Filippov Aug. 17, 2015, 9:59 p.m. UTC
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.
---
 libgcc/config/xtensa/lib2funcs.S | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

Comments

augustine.sterling@gmail.com Aug. 18, 2015, 12:50 a.m. UTC | #1
On Mon, Aug 17, 2015 at 2:59 PM, Max Filippov <jcmvbkbc@gmail.com> wrote:
> 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.

Approved.
Max Filippov Aug. 18, 2015, 1:10 a.m. UTC | #2
On Tue, Aug 18, 2015 at 3:50 AM, augustine.sterling@gmail.com
<augustine.sterling@gmail.com> wrote:
> On Mon, Aug 17, 2015 at 2:59 PM, Max Filippov <jcmvbkbc@gmail.com> wrote:
>> 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.
>
> Approved.

Applied whole series to trunk. Thank you!

-- Max
diff mbox

Patch

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
-	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 @@  __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