i386: Remove syscall assembly codes with 6 arguments
commit83c01ab32b9aa7b27e4e88ed2969d14549e33c5c
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 15 Oct 2015 11:33:15 +0000 (15 04:33 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 15 Oct 2015 12:03:24 +0000 (15 05:03 -0700)
tree02a2124b188dab51710cb83850eda69bfe517c01
parenta014cecd82b71b70a6a843e250e06b541ad524f7
i386: Remove syscall assembly codes with 6 arguments

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.
ChangeLog
sysdeps/unix/sysv/linux/i386/Makefile
sysdeps/unix/sysv/linux/i386/mmap.S [deleted file]
sysdeps/unix/sysv/linux/i386/mmap.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/mmap64.S [deleted file]
sysdeps/unix/sysv/linux/i386/semtimedop.S [deleted file]