mirror of git://sourceware.org/git/glibc.git
This patch removes i386 assembly implementation for mmap, mmap64, semtimeop now that i386 have 6 argument syscall support from C code and GCC 5 can inline syscalls with 6 arguments. We also compile mmap.c, mmap64.c and semtimedop.c with -fomit-frame-pointer since %ebp may be used to pass the 6th argument to syscall. Fo sysdeps/unix/sysv/linux/i386/mmap.c, with -O2 -march=i686 -mtune=generic, GCC 5.2 now generates: <__mmap>: 0: sub $0x10,%esp 3: mov 0x28(%esp),%eax 7: mov %ebx,(%esp) a: mov 0x18(%esp),%ecx e: mov %esi,0x4(%esp) 12: mov 0x14(%esp),%ebx 16: mov %edi,0x8(%esp) 1a: mov 0x1c(%esp),%edx 1e: test $0xfff,%eax 23: mov 0x20(%esp),%esi 27: mov %ebp,0xc(%esp) 2b: mov 0x24(%esp),%edi 2f: jne 60 <__mmap+0x60> 31: shr $0xc,%eax 34: mov %eax,%ebp 36: mov $0xc0,%eax 3b: call *%gs:0x10 42: cmp $0xfffff000,%eax 47: ja 65 <__mmap+0x65> 49: mov (%esp),%ebx 4c: mov 0x4(%esp),%esi 50: mov 0x8(%esp),%edi 54: mov 0xc(%esp),%ebp 58: add $0x10,%esp 5b: ret 5c: lea 0x0(%esi,%eiz,1),%esi 60: mov $0xffffffea,%eax 65: mov (%esp),%ebx 68: mov 0x4(%esp),%esi 6c: mov 0x8(%esp),%edi 70: mov 0xc(%esp),%ebp 74: add $0x10,%esp 77: jmp 78 <__mmap+0x78> vs sysdeps/unix/sysv/linux/i386/mmap.S: <__mmap>: 0: push %ebp 1: push %ebx 2: push %esi 3: push %edi 4: mov 0x14(%esp),%ebx 8: mov 0x18(%esp),%ecx c: mov 0x1c(%esp),%edx 10: mov 0x20(%esp),%esi 14: mov 0x24(%esp),%edi 18: mov 0x28(%esp),%ebp 1c: test $0xfff,%ebp 22: mov $0xffffffea,%eax 27: jne 38 <__mmap+0x38> 29: shr $0xc,%ebp 2c: mov $0xc0,%eax 31: call *%gs:0x10 38: pop %edi 39: pop %esi 3a: pop %ebx 3b: pop %ebp 3c: cmp $0xfffff000,%eax 41: ja 44 <__mmap+0x44> 43: ret 44: call 45 <__mmap+0x45> 45: R_386_PC32 __x86.get_pc_thunk.cx 49: add $0x2,%ecx 4b: R_386_GOTPC _GLOBAL_OFFSET_TABLE_ 4f: mov 0x0(%ecx),%ecx 51: R_386_TLS_GOTIE __libc_errno 55: neg %eax 57: mov %eax,%gs:(%ecx) 5a: or $0xffffffff,%eax 5d: ret The C version has: 3: mov 0x28(%esp),%eax ... 1e: test $0xfff,%eax ... 31: sar $0xc,%eax 34: mov %eax,%ebp is due to missing $ebx register constraint for inline asm. We have to use "r" constraint with register unsigned int _a6 asm ("ebp") = (unsigned int) (arg6); and compiler chose %eax for offset (arg6) in if (offset & (MMAP_PAGE_UNIT - 1)) * sysdeps/unix/sysv/linux/i386/Makefile (CFLAGS-epoll_pwait.c): Add -fomit-frame-pointer. (CFLAGS-mmap.c): Likewise. (CFLAGS-mmap64.c): Likewise. (CFLAGS-semtimedop.c): Likewise. * sysdeps/unix/sysv/linux/i386/mmap.c: New file. * sysdeps/unix/sysv/linux/i386/mmap.S: Remove file. * sysdeps/unix/sysv/linux/i386/mmap64.S: Likewise. * sysdeps/unix/sysv/linux/i386/semtimedop.S: Likewise. |
||
---|---|---|
.. | ||
i686 | ||
i786 | ||
Implies | ||
Makefile | ||
Versions | ||
____longjmp_chk.S | ||
_exit.S | ||
alphasort64.c | ||
arch-fork.h | ||
brk.c | ||
c++-types.data | ||
clone.S | ||
configure | ||
configure.ac | ||
dl-librecon.h | ||
dl-procinfo.h | ||
dl-sysdep.h | ||
epoll_pwait.S | ||
fcntl.c | ||
fxstat.c | ||
fxstatat.c | ||
get_clockfreq.c | ||
getcontext.S | ||
getdents64.c | ||
getmsg.c | ||
getrlimit64.c | ||
gettimeofday.c | ||
glob64.c | ||
init-first.c | ||
kernel-features.h | ||
ld.abilist | ||
ldconfig.h | ||
libBrokenLocale.abilist | ||
libanl.abilist | ||
libc-do-syscall.S | ||
libc-lowlevellock.S | ||
libc.abilist | ||
libcrypt.abilist | ||
libdl.abilist | ||
libm.abilist | ||
libnsl.abilist | ||
libpthread.abilist | ||
libresolv.abilist | ||
librt.abilist | ||
libthread_db.abilist | ||
libutil.abilist | ||
lll_timedlock_wait.c | ||
lll_timedwait_tid.c | ||
localplt.data | ||
lockf64.c | ||
lowlevellock.S | ||
lowlevellock.h | ||
lowlevelrobustlock.S | ||
lxstat.c | ||
makecontext.S | ||
mmap.c | ||
olddirent.h | ||
oldgetrlimit64.c | ||
posix_fadvise64.S | ||
profil-counter.h | ||
pthread_barrier_wait.S | ||
pthread_cond_broadcast.S | ||
pthread_cond_signal.S | ||
pthread_cond_timedwait.S | ||
pthread_cond_wait.S | ||
putmsg.c | ||
readdir64.c | ||
readdir64_r.c | ||
readelflib.c | ||
register-dump.h | ||
scandir64.c | ||
setcontext.S | ||
setegid.c | ||
seteuid.c | ||
setgid.c | ||
setgroups.c | ||
setregid.c | ||
setresgid.c | ||
setresuid.c | ||
setreuid.c | ||
setuid.c | ||
shlib-versions | ||
sigaction.c | ||
sigcontextinfo.h | ||
smp.h | ||
swapcontext.S | ||
syscall.S | ||
syscalls.list | ||
sysdep-cancel.h | ||
sysdep.c | ||
sysdep.h | ||
time.c | ||
ucontext_i.sym | ||
versionsort64.c | ||
vfork.S | ||
xstat.c |