> > Dear Alessandro Rubini, > > In message <20091008074114.ga30...@mail.gnudd.com> you wrote: > > > > Since int is 32 also on 64bit systems, I used unsigned long. > > Note that this is not guaranteed, though. It could be 64 bit as well. > > > > /* do it one word at a time (32 bits or 64 bits) if possible */ > > if ( ((count | (int)s) & (sizeof(long) - 1)) == 0) { > > count /= sizeof(long); > > cl = (c & 0xff) | ((c & 0xff) << 8); > > cl |= cl << 16; > > if (sizeof(long) > 4) > > cl |= cl << 32; > > How about: > > cl = 0; > for (i=0; i<sizeof(long); ++i) { > cl <<= 8; > cl |= c & 0xff; > } > > GCC optimization will do the rest...
If you want gcc to optimise well, make it easy to do so. Changing the for loop into: for (i=sizeof(long); i; --i) makes it easier for gcc and more likely to result in optimal code. Similarly for copy ops for(--top,--fromp, i = len/4; i; --i) *++top = *++fromp; /* pre incr can be one op on some archs */ Jocke _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot