diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-12 09:13:29 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-08-21 04:47:50 -0700 |
commit | cef5133745fcceec6104a059aaace873802c6049 (patch) | |
tree | ed9da6a5d784dc4d052d3a955ad858cdbe170395 /nptl/old_pthread_cond_wait.c | |
parent | 0c5b8b5941e036dcaac69cecee9f01fdf9218e6e (diff) | |
download | glibc-cef5133745fcceec6104a059aaace873802c6049.tar.gz |
Optimize i386 syscall inlining
Define INLINE_SYSCALL_RETURN and INLINE_SYSCALL_ERROR_RETURN so
that i386 can optimize setting errno by branching to the internal
__syscall_error without PLT.
Since GCC 5 and above can properly spill %ebx when needed, we can inline
syscalls with 6 arguments if GCC 5 or above is used to compile glibc.
This patch rewrites INTERNAL_SYSCALL macros and skips __libc_do_syscall
for GCC 5.
For sysdeps/unix/sysv/linux/i386/brk.c, with -O2 -march=i686
-mtune=generic, GCC 5.2 now generates:
<__brk>:
0: push %ebx
1: mov $0x2d,%eax
6: mov 0x8(%esp),%ebx
a: call b <__brk+0xb> b: R_386_PC32 __x86.get_pc_thunk.dx
f: add $0x2,%edx 11: R_386_GOTPC _GLOBAL_OFFSET_TABLE_
15: call *%gs:0x10
1c: mov 0x0(%edx),%edx 1e: R_386_GOT32 __curbrk
22: cmp %eax,%ebx
24: mov %eax,(%edx)
26: ja 30 <__brk+0x30>
28: xor %eax,%eax
2a: pop %ebx
2b: ret
instead of
<__brk>:
0: push %ebx
1: mov 0x8(%esp),%ecx
5: call 6 <__brk+0x6> 6: R_386_PC32 __x86.get_pc_thunk.bx
a: add $0x2,%ebx c: R_386_GOTPC _GLOBAL_OFFSET_TABLE_
10: xchg %ecx,%ebx
12: mov $0x2d,%eax
17: call *%gs:0x10
1e: xchg %ecx,%ebx
20: mov %eax,%edx
22: mov 0x0(%ebx),%eax 24: R_386_GOT32 __curbrk
28: mov %edx,(%eax)
2a: xor %eax,%eax
2c: cmp %edx,%ecx
2e: ja 38 <__brk+0x38>
30: pop %ebx
31: ret
The new one is shorter by 2 instructions.
* sysdeps/unix/sysv/linux/i386/Makefile [$(subdir) == csu]
(sysdep-dl-routines): Add sysdep.
[$(subdir) == nptl] (libpthread-routines): Likewise.
[$(subdir) == rt] (librt-routines): Likewise.
* sysdeps/unix/sysv/linux/i386/brk.c (__brk): Add
INTERNAL_SYSCALL_DECL. Use INLINE_SYSCALL_ERROR_RETURN.
* sysdeps/unix/sysv/linux/i386/clone.S (__clone): Don't check
PIC when branching to SYSCALL_ERROR_LABEL.
* sysdeps/unix/sysv/linux/i386/fcntl.c (__fcntl_nocancel): Use
INLINE_SYSCALL_RETURN and INLINE_SYSCALL_ERROR_RETURN.
(__libc_fcntl): Likewise.
* sysdeps/unix/sysv/linux/i386/fxstat.c (__fxstat): Likewise.
* sysdeps/unix/sysv/linux/i386/fxstatat.c (__fxstatat):
Likewise.
* sysdeps/unix/sysv/linux/i386/getmsg.c (getmsg): Likewise.
* sysdeps/unix/sysv/linux/i386/lockf64.c (lockf64): Likewise.
* sysdeps/unix/sysv/linux/i386/lxstat.c (__lxstat): Likewise.
* sysdeps/unix/sysv/linux/i386/msgctl.c (__old_msgctl):
Likewise.
(__new_msgctl): Likewise.
* sysdeps/unix/sysv/linux/i386/putmsg.c (putmsg): Likewise.
* sysdeps/unix/sysv/linux/i386/semctl.c (__old_semctl):
Likewise.
(__new_semctl): Likewise.
* sysdeps/unix/sysv/linux/i386/setegid.c (setegid): Likewise.
* sysdeps/unix/sysv/linux/i386/seteuid.c (seteuid): Likewise.
* sysdeps/unix/sysv/linux/i386/setgid.c (__setgid): Likewise.
* sysdeps/unix/sysv/linux/i386/setgroups.c (setgroups):
Likewise.
* sysdeps/unix/sysv/linux/i386/setregid.c (__setregid):
Likewise.
* sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid):
Likewise.
* sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid):
Likewise.
* sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid):
Likewise.
* sysdeps/unix/sysv/linux/i386/setuid.c (__setuid): Likewise.
* sysdeps/unix/sysv/linux/i386/shmctl.c (__old_shmctl):
Likewise.
(__new_shmctl): Likewise.
* sysdeps/unix/sysv/linux/i386/sigaction.c (__libc_sigaction):
Likewise.
* sysdeps/unix/sysv/linux/i386/xstat.c (__xstat): Likewise.
* sysdeps/unix/sysv/linux/i386/libc-do-syscall.S
(__libc_do_syscall): Defined only if !__GNUC_PREREQ (5,0).
* sysdeps/unix/sysv/linux/i386/sysdep.S: Removed.
* sysdeps/unix/sysv/linux/i386/sysdep.c: New file.
* sysdeps/unix/sysv/linux/i386/sysdep.h: Define assembler macros
only if !__GNUC_PREREQ (5,0).
(SYSCALL_ERROR_LABEL): Changed to __syscall_error.
(SYSCALL_ERROR_HANDLER): Changed to empty.
(SYSCALL_ERROR_ERRNO): Removed.
(SYSCALL_ERROR_HANDLER_TLS_STORE): Likewise.
(__syscall_error): New prototype.
(INLINE_SYSCALL_RETURN): New.
(INLINE_SYSCALL_ERROR_RETURN): Likewise.
(LOADREGS_0): Likewise.
(ASMARGS_0): Likewise.
(LOADREGS_1): Likewise.
(ASMARGS_1): Likewise.
(LOADREGS_2): Likewise.
(ASMARGS_2): Likewise.
(LOADREGS_3): Likewise.
(ASMARGS_3): Likewise.
(LOADREGS_4): Likewise.
(ASMARGS_4): Likewise.
(LOADREGS_5): Likewise.
(ASMARGS_5): Likewise.
(LOADREGS_6): Likewise.
(ASMARGS_6): Likewise.
(INTERNAL_SYSCALL_MAIN_6): Optimize for GCC 5.
(INTERNAL_SYSCALL_MAIN_INLINE): Likewise.
(INTERNAL_SYSCALL_NCS): Likewise.
Diffstat (limited to 'nptl/old_pthread_cond_wait.c')
0 files changed, 0 insertions, 0 deletions