microblaze: Support C optimized lib functions for little-endian

Optimized C library functions can rapidly speedup the kernel.
memset doesn't need to be optimized because there is no difference
in behavior on little/big endian cpu.

Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
Michal Simek 2010-10-09 14:05:58 +10:00
Родитель 93e2e85139
Коммит 1180b28ca8
2 изменённых файлов: 60 добавлений и 6 удалений

Просмотреть файл

@ -93,7 +93,7 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)
case 0x1: /* Unaligned - Off by 1 */ case 0x1: /* Unaligned - Off by 1 */
/* Word align the source */ /* Word align the source */
i_src = (const void *) ((unsigned)src & ~3); i_src = (const void *) ((unsigned)src & ~3);
#ifndef __MICROBLAZEEL__
/* Load the holding buffer */ /* Load the holding buffer */
buf_hold = *i_src++ << 8; buf_hold = *i_src++ << 8;
@ -102,7 +102,16 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)
*i_dst++ = buf_hold | value >> 24; *i_dst++ = buf_hold | value >> 24;
buf_hold = value << 8; buf_hold = value << 8;
} }
#else
/* Load the holding buffer */
buf_hold = (*i_src++ & 0xFFFFFF00) >>8;
for (; c >= 4; c -= 4) {
value = *i_src++;
*i_dst++ = buf_hold | ((value & 0xFF) << 24);
buf_hold = (value & 0xFFFFFF00) >>8;
}
#endif
/* Realign the source */ /* Realign the source */
src = (const void *)i_src; src = (const void *)i_src;
src -= 3; src -= 3;
@ -110,7 +119,7 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)
case 0x2: /* Unaligned - Off by 2 */ case 0x2: /* Unaligned - Off by 2 */
/* Word align the source */ /* Word align the source */
i_src = (const void *) ((unsigned)src & ~3); i_src = (const void *) ((unsigned)src & ~3);
#ifndef __MICROBLAZEEL__
/* Load the holding buffer */ /* Load the holding buffer */
buf_hold = *i_src++ << 16; buf_hold = *i_src++ << 16;
@ -119,7 +128,16 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)
*i_dst++ = buf_hold | value >> 16; *i_dst++ = buf_hold | value >> 16;
buf_hold = value << 16; buf_hold = value << 16;
} }
#else
/* Load the holding buffer */
buf_hold = (*i_src++ & 0xFFFF0000 )>>16;
for (; c >= 4; c -= 4) {
value = *i_src++;
*i_dst++ = buf_hold | ((value & 0xFFFF)<<16);
buf_hold = (value & 0xFFFF0000) >>16;
}
#endif
/* Realign the source */ /* Realign the source */
src = (const void *)i_src; src = (const void *)i_src;
src -= 2; src -= 2;
@ -127,7 +145,7 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)
case 0x3: /* Unaligned - Off by 3 */ case 0x3: /* Unaligned - Off by 3 */
/* Word align the source */ /* Word align the source */
i_src = (const void *) ((unsigned)src & ~3); i_src = (const void *) ((unsigned)src & ~3);
#ifndef __MICROBLAZEEL__
/* Load the holding buffer */ /* Load the holding buffer */
buf_hold = *i_src++ << 24; buf_hold = *i_src++ << 24;
@ -136,7 +154,16 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)
*i_dst++ = buf_hold | value >> 8; *i_dst++ = buf_hold | value >> 8;
buf_hold = value << 24; buf_hold = value << 24;
} }
#else
/* Load the holding buffer */
buf_hold = (*i_src++ & 0xFF000000) >> 24;
for (; c >= 4; c -= 4) {
value = *i_src++;
*i_dst++ = buf_hold | ((value & 0xFFFFFF) << 8);
buf_hold = (value & 0xFF000000) >> 24;
}
#endif
/* Realign the source */ /* Realign the source */
src = (const void *)i_src; src = (const void *)i_src;
src -= 1; src -= 1;

Просмотреть файл

@ -114,7 +114,7 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
case 0x1: /* Unaligned - Off by 1 */ case 0x1: /* Unaligned - Off by 1 */
/* Word align the source */ /* Word align the source */
i_src = (const void *) (((unsigned)src + 4) & ~3); i_src = (const void *) (((unsigned)src + 4) & ~3);
#ifndef __MICROBLAZEEL__
/* Load the holding buffer */ /* Load the holding buffer */
buf_hold = *--i_src >> 24; buf_hold = *--i_src >> 24;
@ -123,7 +123,16 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
*--i_dst = buf_hold << 8 | value; *--i_dst = buf_hold << 8 | value;
buf_hold = value >> 24; buf_hold = value >> 24;
} }
#else
/* Load the holding buffer */
buf_hold = (*--i_src & 0xFF) << 24;
for (; c >= 4; c -= 4) {
value = *--i_src;
*--i_dst = buf_hold | ((value & 0xFFFFFF00)>>8);
buf_hold = (value & 0xFF) << 24;
}
#endif
/* Realign the source */ /* Realign the source */
src = (const void *)i_src; src = (const void *)i_src;
src += 1; src += 1;
@ -131,7 +140,7 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
case 0x2: /* Unaligned - Off by 2 */ case 0x2: /* Unaligned - Off by 2 */
/* Word align the source */ /* Word align the source */
i_src = (const void *) (((unsigned)src + 4) & ~3); i_src = (const void *) (((unsigned)src + 4) & ~3);
#ifndef __MICROBLAZEEL__
/* Load the holding buffer */ /* Load the holding buffer */
buf_hold = *--i_src >> 16; buf_hold = *--i_src >> 16;
@ -140,7 +149,16 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
*--i_dst = buf_hold << 16 | value; *--i_dst = buf_hold << 16 | value;
buf_hold = value >> 16; buf_hold = value >> 16;
} }
#else
/* Load the holding buffer */
buf_hold = (*--i_src & 0xFFFF) << 16;
for (; c >= 4; c -= 4) {
value = *--i_src;
*--i_dst = buf_hold | ((value & 0xFFFF0000)>>16);
buf_hold = (value & 0xFFFF) << 16;
}
#endif
/* Realign the source */ /* Realign the source */
src = (const void *)i_src; src = (const void *)i_src;
src += 2; src += 2;
@ -148,7 +166,7 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
case 0x3: /* Unaligned - Off by 3 */ case 0x3: /* Unaligned - Off by 3 */
/* Word align the source */ /* Word align the source */
i_src = (const void *) (((unsigned)src + 4) & ~3); i_src = (const void *) (((unsigned)src + 4) & ~3);
#ifndef __MICROBLAZEEL__
/* Load the holding buffer */ /* Load the holding buffer */
buf_hold = *--i_src >> 8; buf_hold = *--i_src >> 8;
@ -157,7 +175,16 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
*--i_dst = buf_hold << 24 | value; *--i_dst = buf_hold << 24 | value;
buf_hold = value >> 8; buf_hold = value >> 8;
} }
#else
/* Load the holding buffer */
buf_hold = (*--i_src & 0xFFFFFF) << 8;
for (; c >= 4; c -= 4) {
value = *--i_src;
*--i_dst = buf_hold | ((value & 0xFF000000)>> 24);
buf_hold = (value & 0xFFFFFF) << 8;;
}
#endif
/* Realign the source */ /* Realign the source */
src = (const void *)i_src; src = (const void *)i_src;
src += 3; src += 3;