Inefficient ia64 system call implementation in glibc

John Worley jworley@fc.hp.com
Fri Sep 19 21:46:00 GMT 2003


H.J. Lu <hjl@lucon.org> write:

> The inline ia64 system call assumes all values passed to kernel are
> signed 64bit. It does sign extension if the incoming arg is not signed
> 64bit. In case of fxstat.c:
> 
> int
> __fxstat (int vers, int fd, struct stat *buf)
> {
>   return INLINE_SYSCALL (fstat, 2, fd, CHECK_1 (buf));
> }
>  
> it leads to
> 
> 0000000000000000 <__fxstat>:
>    0:   00 20 39 0c 80 05       [MII]       alloc r36=ar.pfs,14,6,0
>    6:   f0 e0 01 12 48 a0                   mov r15=1212
>    c:   04 08 00 84                         mov r37=r1
>   10:   01 38 01 44 00 21       [MII]       mov r39=r34
>   16:   60 02 84 2c 00 60                   sxt4 r38=r33
> 					    ^^^^^^^^^^^^^
>   1c:   04 00 c4 00                         mov r35=b0;;
>   20:   0a 00 00 00 00 02       [MMI]       break.m 0x100000;;
>   26:   10 02 20 00 42 e0                   mov r33=r8

     The real inefficiency here is the compiler output. Given the
realities of the Itanium 2 implementation, the first two bundles
will require 3 cycles to execute. A better coding would be:

	{	.mmi
		alloc	r36=ar.pfs,14,6,0
		mov	r15=1212
		mov	r35=b0
	}
	{	.mmi
		mov	r37=r1
		mov	r39=r34
		sxt4	r38=r33
	} ;;

     which will execute in one cycle. The sign extension, although
"unnecessary" doesn't cost any cycles. Admittedly you could use the
mi;;i bundle to pack the break instruction in the second bundle if
you didn't have to sign-extend, but I'd rather see the 3 v. 1 cycle
problem addressed first.

	Regards,
	John "I worry about this stuff way too much" Worley
	john.worley@hp.com




More information about the Libc-alpha mailing list