Re: faster strcpy()

Alexander Kjeldaas (astor@guardian.no)
Sun, 26 Apr 1998 01:31:08 +0200


On Sun, Apr 26, 1998 at 12:44:28AM +0200, Alexander Kjeldaas wrote:
> On Fri, Apr 24, 1998 at 11:26:09AM +0100, Philip Blundell wrote:
> > >It's something like subtracting 0x01010101 from the dword and oring with
> > >0x80808080 to detect the carry, but that's not quite it. Perhaps you do
> >
> > /* The following magic check was designed by A. Mycroft. It yields a */
> > /* nonzero value if the argument w has a zero byte in it somewhere. The */
> > /* messy constants have been unfolded a bit in this code so that they */
> > /* get preloaded into registers before relevant loops. */
> >
> > #ifdef _copywords
> > # define ONES_WORD 0x01010101
> > # define EIGHTS_WORD (ones_word << 7)
> > # define nullbyte_prologue_() \
> > int ones_word = ONES_WORD;
> > # define word_has_nullbyte(w) (((w) - ones_word) & ~(w) & EIGHTS_WORD)
> > #endif
> >
>
> I'm not sure why Mycroft used '& ~(w)' in the above. Unless something
> obvious escapes me, you can optimize the above down to 3
> instructions. Both codepaths have a dependency chain of 3
> instructions.
>
> #define word_has_nullbyte(w) ((((w) - 0x01010101) ^ (w)) & 0x80808080)
>

Hmm.. two things obviously escaped me:

1) The above fails horribly and detects 0x80 as a null.

2) Mycroft's version has a dependency chain of 2 instructions on RISCs
with 'nand' instruction.

astor - who will test stuff next time

-- 
 Alexander Kjeldaas, Guardian Networks AS, Trondheim, Norway
 http://www.guardian.no/

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu