xref: /csrg-svn/lib/libc/string/bcopy.c (revision 30423)
1 /*
2  * Copyright (c) 1987 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #if defined(LIBC_SCCS) && !defined(lint)
8 static char sccsid[] = "@(#)bcopy.c	5.1 (Berkeley) 01/27/87";
9 #endif LIBC_SCCS and not lint
10 
11 /*
12  * bcopy -- vax movc3 instruction
13  */
14 bcopy(src, dst, length)
15 	register char *src, *dst;
16 	register int length;
17 {
18 	if (length && src != dst)
19 		if ((u_int)dst < (u_int)src)
20 			if (((int)src | (int)dst | length) & 3)
21 				do	/* copy by bytes */
22 					*dst++ = *src++;
23 				while (--length);
24 			else {
25 				length >>= 2;
26 				do	/* copy by longs */
27 					*((long *)dst)++ = *((long *)src)++;
28 				while (--length);
29 			}
30 		else {			/* copy backwards */
31 			src += length;
32 			dst += length;
33 			if (((int)src | (int)dst | length) & 3)
34 				do	/* copy by bytes */
35 					*--dst = *--src;
36 				while (--length);
37 			else {
38 				length >>= 2;
39 				do	/* copy by shorts */
40 					*--((long *)dst) = *--((long *)src);
41 				while (--length);
42 			}
43 		}
44 	return(0);
45 }
46