[PATCH] Optimize i386 syscall inlining for GCC 5
H.J. Lu
hjl.tools@gmail.com
Thu Aug 13 00:10:00 GMT 2015
On Wed, Aug 12, 2015 at 4:37 PM, Zack Weinberg <zackw@panix.com> wrote:
> If I'm reading that right, it's still not quite optimal; there's an
> unnecessary register shuffle after the system call... better would be
>
> push %ebx
> mov $0x2d,%eax
> mov 0x8(%esp),%ebx
> call __x86.get_pc_thunk.cx
> add $_GLOBAL_OFFSET_TABLE_,%ecx
> call *%gs:0x10
> mov __curbrk(%ecx),%edx
> mov %eax,(%edx)
> cmp %eax,%ebx
> ja 1f
> xor %eax,%eax
> pop %ebx
> ret
> 1:
> ; set errno and return -1
>
> I think the compiler might've done it the way it did because then it
> could hoist the xor %eax,%eax above the comparison, but the branch is
> so unlikely that that's not a good choice.
>
> But also, in context, I think it would be more helpful if you could
> show the generated assembly for a *six*-argument syscall, ne?
I am looking into overhauling i386 syscall implementation. I
think I can do much better for libc.so.
--
H.J.
More information about the Libc-alpha
mailing list