[PATCH 6/6] i386: Remove syscall assembly codes with 6 arguments
H.J. Lu
hjl.tools@gmail.com
Wed Oct 14 12:54:00 GMT 2015
On Mon, Oct 12, 2015 at 4:20 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> This patch removes i386 assembly implementation for epoll_wait, mmap,
> mmap64, semtimeop now that i386 have 6 argument syscall support from
> C code and GCC 5 can inline syscalls with 6 argument. We also compile
> epoll_pwait.c, 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/epoll_pwait.S: Remove file.
> * sysdeps/unix/sysv/linux/i386/mmap.S: Likewise.
> * sysdeps/unix/sysv/linux/i386/mmap64.S: Likewise.
> * sysdeps/unix/sysv/linux/i386/semtimedop.S: Likewise.
3 of 6 patches have been checked in. Here is the updated patch.
OK for master?
Thanks.
--
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0003-i386-Remove-syscall-assembly-codes-with-6-arguments.patch
Type: text/x-patch
Size: 15893 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20151014/e2a94b8c/attachment.bin>
More information about the Libc-alpha
mailing list