X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2F_memcpy.c;h=540c2cf296e9f6ff51b84b5ea3de2dc4c65aaa8c;hb=d08e6df2202ed3f19b681221b502dedb3c6c8a28;hp=e1d0770067a940470b506e5ca5a348e95f16cab2;hpb=b09af35f2f1cde7649d3ac4a6f5d2af6d97895a0;p=fw%2Fsdcc diff --git a/device/lib/_memcpy.c b/device/lib/_memcpy.c index e1d07700..540c2cf2 100644 --- a/device/lib/_memcpy.c +++ b/device/lib/_memcpy.c @@ -3,17 +3,17 @@ Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + GNU Library General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -22,24 +22,56 @@ what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #include "string.h" -#define NULL (void *)0 +#include -void _generic * memcpy ( - void _generic * dst, - void _generic * src, - int count +#if !_SDCC_PORT_PROVIDES_MEMCPY + +#undef memcpy /* Avoid conflict with builtin memcpy() in Z80 port */ + +void * memcpy ( + void * dst, + void * src, + size_t acount ) { - void _generic * ret = dst; - char _generic * d = dst; - char _generic * s = src; +#if _SDCC_Z80_STYLE_LIB_OPT + +#pragma noinduction + + char * d = dst; + char * s = src; + /* PENDING: Divide first to get around sign problems */ + int count = -(acount >> 2); + + while (count) { + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + *d++ = *s++; + count++; + } + + if (acount & 2) { + *d++ = *s++; + *d++ = *s++; + } + if (acount & 1) { + *d++ = *s++; + } + return dst; +#else + void * ret = dst; + char * d = dst; + char * s = src; /* * copy from lower addresses to higher addresses */ - while (count--) { + while (acount--) { *d++ = *s++; } return(ret); +#endif } +#endif