Newsgroups: comp.sys.super,comp.parallel.mpi,comp.lang.ada
From: Andi Kleen <ak@muc.de>
Subject: Re: ADA on the super
Organization: [posted via] Leibniz-Rechenzentrum, Muenchen (Germany)
Date: 21 Apr 1998 12:58:24 +0200
Message-ID: <m3son7o2zz.fsf@fred.muc.de>

dewar@merv.cs.nyu.edu (Robert Dewar) writes:

> <<Gnat has good optimization. Gnat has good code generation
> except for packed arrays. Robert is right about bench
> marking your application with ALL of your data before
> deciding what is fast and what is slow.
> >>
> 
> Actually, this is probably an over-generalization. Packed array stuff is
> notorious, since there are so many special cases, and a given compiler
> is likely to do some but not all special casing. GNAT does some packed
> array stuff really efficiently, and other stuff is pretty horrible. A
> good challenge is Mats Weber's
> 
>     x := x(1 .. 31) & x(0);
> 
> to do a simple rotate. It would be impressive if a compiler generated
> a single rotate instruction for this -- well to be more accurate, it 
> would be surprising if such an optimization came out of a general
> approach (it is always easy to add one more special case). Certainly
> GNAT comes *nowhere* near generating a single instruction for this
> particular case.

It is surprising that Gnat doesn't do this. At least the C frontend of gcc 
does a very similar optimization:

/* Expects sizeof(unsigned int) == 4 */
int rotate(unsigned int i)
{
	return (i << 1) | (i >> 31);
}

Compiled with -O2 on i386 Linux.

	.file	"t13.c"
	.version	"01.01"
gcc2_compiled.:
.text
	.align 4
.globl rotate
	.type	 rotate,@function
rotate:
	pushl %ebp
	movl %esp,%ebp
	movl 8(%ebp),%eax
	roll $1,%eax
	leave
	ret
.Lfe1:
	.size	 rotate,.Lfe1-rotate
	.ident	"GCC: (GNU) 2.7.2.1"
	
	
-Andi	


