Path: utzoo!attcan!uunet!ingr!jones
From: jones@ingr.UUCP (Mark Jones)
Newsgroups: comp.lang.c
Subject: "conventional" copy fragment?
Message-ID: <2585@ingr.UUCP>
Date: 21 Sep 88 16:03:26 GMT
References: <8809092109.AA06071@tycho.yerkes.uchicago.edu>
Organization: Intergraph Corp. Huntsville, Al
Lines: 62
Re: Writing Trashy efficient code (digression from Duff's device.)

In article <8809092109.AA06071@tycho.yerkes.uchicago.edu>, pearce@TYCHO.YERKES.UCHICAGO.EDU ("Eric C. Pearce") writes:
> 
> Personally, I prefer this "conventional" copy fragment:
> 
>       A = array1;
>       B = array2;
> 
>       n = Count / 8;
>       for (i =  Count%8; i > 0; i--)
> 	 *A++ = *B++;
>       while (--n >= 0) {
> 	 *A++ = *B++; 
> 	 *A++ = *B++; 
> 	 *A++ = *B++; 
> 	 *A++ = *B++; 
> 	 *A++ = *B++; 
> 	 *A++ = *B++; 
> 	 *A++ = *B++; 
> 	 *A++ = *B++; 
>       } 
> 
> >From a performance standpoint, it falls only 2% behind duff device and
> is 102% more readable and not "kludgy".

How about this "conventional" copy fragment

	memcpy(array2,array1,sizeof(*A)*Count);	/* copy array1 to array2 */

Almost every system has this call (I have never seen one that didn't)
and if it was implemented well, it could be done in as few as 7
instructions, on a brain damaged microprocessor.

	mov	cx,{Count|
	shl	cx,1			/* for 2 byte objects */
	shl	cx,1			/* for 4 byte objects */
	mov	si,{address of array1}
	mov	di,{address of array2}
	repnz
	movsw				/* done */

or
	mov.l	a0,?(a7)
	mov.l	a1,?(a7)
	mov.?	d0,Count;
	/* shift left once or twice */
loop:
	mov.b	(a0)+,(a1)+
	dbnz	loop		/* i don't remember the exact syntax here */


Mark Jones

PS I don't guarantee syntax, but you should get the idea.  Use the
functions in the C library.  If you need more speed, recode the library
routines in assembly, and link them in ahead of the standard library. 
Don't write trashy C code to try to get better speed.  It just ain't
worth it, now or later.


PPS Yes, I know the 68000 code could be made even better, very easily,
(should check for alignment, use bigger moves, etc...) but this is only
an example.