This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] s390: optimize syscall function
- From: Christian Borntraeger <borntraeger at de dot ibm dot com>
- To: Stefan Liebler <stli at linux dot vnet dot ibm dot com>, Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- Cc: libc-alpha at sourceware dot org, Martin Schwidefsky <schwidefsky at de dot ibm dot com>, Christian Borntraeger <borntraeger at de dot ibm dot com>
- Date: Fri, 9 Jun 2017 13:29:07 +0200
- Subject: [PATCH] s390: optimize syscall function
- Authentication-results: sourceware.org; auth=none
Since kernel 2.6.0 all Linux version accept the system call number
in register 1 for svc 0. There is no need to have special handling
that uses EX for system calls < 256. This will simplify and speed
up that code.
A microbenchmark doing "syscall(__NR_getpid);" in a loops gets faster
by ~12%.
* sysdeps/unix/sysv/linux/s390/s390-64/syscall.S: Simplify
code by always using SVC 0 instead of EX.
* sysdeps/unix/sysv/linux/s390/s390-64/syscall.S: Likewise.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
sysdeps/unix/sysv/linux/s390/s390-32/syscall.S | 12 +++---------
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S | 12 +++---------
2 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
index 8506db1..0fa08cd 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
@@ -49,19 +49,13 @@ ENTRY (syscall)
l %r6,192(%r15) /* fifth parameter */
l %r7,196(%r15) /* sixth parameter */
- basr %r8,0
-0: cl %r1,4f-0b(%r8) /* svc number < 256? */
- jl 2f
-1: svc 0
- j 3f
-2: ex %r1,1b-0b(%r8) /* lsb of R1 is subsituted as SVC number */
-3: l %r15,0(%r15) /* load back chain */
+ svc 0
+ l %r15,0(%r15) /* load back chain. */
cfi_adjust_cfa_offset (-96)
- lm %r6,15,24(%r15) /* load registers */
+ lm %r6,%r15,24(%r15) /* load registers. */
lhi %r0,-4095
clr %r2,%r0 /* check R2 for error */
jnl SYSCALL_ERROR_LABEL
br %r14 /* return to caller */
-4: .long 256
PSEUDO_END (syscall)
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S b/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
index 24c47cb..466f27a 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
@@ -49,20 +49,14 @@ ENTRY (syscall)
lg %r6,320(%r15) /* Fifth parameter. */
lg %r7,328(%r15) /* Sixth parameter. */
- basr %r8,0
-0: clg %r1,4f-0b(%r8) /* svc number < 256? */
- jl 2f
-1: svc 0
- j 3f
-2: ex %r1,1b-0b(%r8) /* lsb of R1 is subsituted as SVC number */
-3: lg %r15,0(%r15) /* load back chain */
+ svc 0
+ lg %r15,0(%r15) /* load back chain. */
cfi_adjust_cfa_offset (-160)
- lmg %r6,15,48(%r15) /* Load registers. */
+ lmg %r6,%r15,48(%r15) /* Load registers. */
lghi %r0,-4095
clgr %r2,%r0 /* Check R2 for error. */
jgnl SYSCALL_ERROR_LABEL
br %r14 /* Return to caller. */
-4: .quad 256
PSEUDO_END (syscall)
--
1.7.1