#define NLWA(a) (((u32_t)(a)) & 3)
#define NWA(a) (((u32_t)(a)) & 1)
#define LD32B(d,p) \
d = *((p) + 3); d <<= 8;\
d |= *((p) + 2); d <<= 8;\
d |= *((p) + 1); d <<= 8;\
d |= *((p) + 0); p += 4
#define LD32W(d,p) \
d = *((p) + 1); d <<= 16;\
d |= *((p) + 0); p += 2
/******************************************************************************
* DESCRIPTION:
*
*****************************************************************************/
void * sa_memcpy(void *dst,void *src,u32_t sz) {
REG_t u32_t *p32s;
REG_t u32_t *p32d;
REG_t u16_t *p16s;
REG_t u32_t lw ;
REG_t u8_t *p8s = (u8_t*)src;
REG_t u8_t *p8d = (u8_t*)dst;
vu32_t i ;
if ((p8s == NULL) || (p8d == NULL) || !sz) {
return p8d;
}
/////////////////////////
// выравниваем dst //
/////////////////////////
while (NLWA(p8d) && sz) {
sz--;
*p8d++ = *p8s++;
}
/////////////////////////
// копируем по 4 байта //
/////////////////////////
p32d = (u32_t*)p8d;
i = sz >> 2;
sz &= 3;
if (i) {
if (NLWA(p8s)) {
/*** src != %4 ***/
if (NWA(p8s)) {
/*** src != %2 ***/
do { LD32B(lw,p8s);
*p32d++ = lw ;
} while(--i);
} else {
/*** src = %2 ***/
p16s = (u16_t*)p8s;
do { LD32W(lw,p16s);
*p32d++ = lw;
} while(--i);
p8s = (u8_t*)p16s;
}
} else {
/*** src = %4 ***/
p32s = (u32_t*)p8s;
do { *p32d++ = *p32s++;
} while(--i);
p8s = (u8_t*)p32s;
}
}
/////////////////////////
// копируем остаток //
/////////////////////////
p8d = (u8_t*)p32d;
while(sz--) {
*p8d++ = *p8s++;
}
return p8d;
}