[PATCH][s390] Replace lll_futex_* assembly code with INTERNAL_SYSCALL
Carlos O'Donell
codonell@redhat.com
Fri Dec 21 17:41:00 GMT 2012
On 12/20/2012 09:01 PM, Siddhesh Poyarekar wrote:
> On Thu, Dec 20, 2012 at 02:19:53PM -0500, Carlos O'Donell wrote:
>>> - __result > -4096UL; \
>>> + __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp), \
>>> + __lll_private_flag (FUTEX_CMP_REQUEUE, private),\
>>> + (nr_wake), (nr_move), (mutex), (val)); \
>>> + INTERNAL_SYSCALL_ERROR_P (__ret, __err); \
>>
>> OK.
>>
>> What generates better code?
>>
>> __result > -4096UL; or ((unsigned long) (val) >= -4095UL)?
>>
>> Is the compiler smart enough to generate the same code?
>>
>
> For S-390, it is the same C code:
>
> #define INTERNAL_SYSCALL_ERROR_P(val, err) \
> ((unsigned int) (val) >= 0xfffff001u)
>
> so the compiler should generate the same code.
Should... :-)
I verified that either > or >= generates the same assembly.
In both cases the compiler converts >= into >, and -4095 into -4096.
I note that the constant used in the comparison is placed into
.rodata, and that loading it from .rodata seems expensive
(not to mention requires a relocation), but I guess materializing
a 32-bit constant must be even more expense? It would seem to me
that we could materialize -4096 with a simple immediate load and
shift? Question for another day.
Cheers,
Carlos.
More information about the Libc-alpha
mailing list