Re: block-sha1: improve code on large-register-set machines
- From
Nicolas Pitre <nico@cam.org>
- Date
- Aug 11, 2009, 19:31 UTC
- Message-ID
- <alpine.LFD.2.00.0908111517390.10633@xanadu.home>
- In-Reply-To
- <alpine.LFD.2.00.0908111254290.10633@xanadu.home>
On Tue, 11 Aug 2009, Nicolas Pitre wrote:
Show 14 quoted lines
> On Tue, 11 Aug 2009, Linus Torvalds wrote:
>
> > On Tue, 11 Aug 2009, Nicolas Pitre wrote:
> > >
> > > #define SHA_SRC(t) \
> > > ({ unsigned char *__d = (unsigned char *)&data[t]; \
> > > (__d[0] << 24) | (__d[1] << 16) | (__d[2] << 8) | (__d[3] << 0); })
> > >
> > > And this provides the exact same performance as the ntohl() based
> > > version (4.980s) except that this now cope with unaligned buffers too.
> >
> > The actual object SHA1 calculations are likely not aligned (we do that
> > object header thing), and if you can't do the htonl() any better way I
> > guess the byte-based thing is the way to go..OK, even better: 4.400s.
This is with this instead of the above:
#define SHA_SRC(t) \
({ unsigned char *__d = (unsigned char *)data; \
(__d[(t)*4 + 0] << 24) | (__d[(t)*4 + 1] << 16) | \
(__d[(t)*4 + 2] << 8) | (__d[(t)*4 + 3] << 0); })The previous version would allocate a new register for __d and then index it with an offset of 0, 1, 2 or 3. This version always uses the register containing the data pointer with absolute offsets. The binary is a bit smaller too.
Nicolas