00001 #ifndef _STRLEN_H_
00002 #define _STRLEN_H_
00003
00004 #include <nlibc.h>
00005 #include <stddef.h>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef __HAS_MAIN
00032 extern size_t strlen( const char *s );
00033 #else
00034 #if !defined(__cflow_processed) || defined(_uses_strlen_strlen_h)
00035 size_t strlen( const char *s )
00036 {
00037 unsigned *p = (unsigned *)s;
00038 int a,c,cr=0;
00039 unsigned mask;
00040 int one = 1,shft= -8;
00041
00042 if( ! (a=*p) ) return 0;
00043
00044 do {
00045 mask = 0xff;
00046 c=0;
00047 do {
00048 unsigned u = a & mask;
00049 #pragma vectorcond
00050 where( u )
00051 c++;
00052 mask >>= shft;
00053 } while( mask );
00054 a = *(++p);
00055 {
00056 int hi,lo;
00057 asm("\tlutcross.L %0 %1\n\tatr.H %0 $ZERO" : "=r" (hi) : "r" (c));
00058 asm("\tlutmove.L %0 %1\n\tatr.H %0 $ZERO" : "=r" (lo) : "r" (c));
00059 cr += hi + lo;
00060 }
00061 } while( a );
00062 return cr;
00063 }
00064 #endif
00065 #endif // Has Main
00066
00067 #endif