int memcpy(const unsigned char *src, unsigned char *dst, int size)
{
if (size & 63) {
printe("size need 64 align");
return -1;
}
asm volatile (
"1: \n"
"vldm %0!,{d0-d7} \n"
"vstm %1!,{d0-d7} \n"
"subs %2,%2,#0x40 \n"
"bgt 1b \n"
:"+r"(src),"+r"(dst),"+r"(size)::"d0","d1","d2","d3","d4","d5","d6","d7","cc","memory");
return 0;
}
int memzero(unsigned char *dst, int size)
{
if (size & 63) {
printe("size need 64 align");
return -1;
}
asm volatile (
"vmov.u64 d0, #0 \n"
"vmov.u64 d1, #0 \n"
"vmov.u64 d2, #0 \n"
"vmov.u64 d3, #0 \n"
"vmov.u64 d4, #0 \n"
"vmov.u64 d5, #0 \n"
"vmov.u64 d6, #0 \n"
"vmov.u64 d7, #0 \n"
"1: \n"
"vstm %0!,{d0-d7} \n"
"subs %1,%1,#0x40 \n"
"bgt 1b \n"
:"+r"(dst),"+r"(size)::"d0","d1","d2","d3","d4","d5","d6","d7","cc","memory");
return 0;
}