#include "strnlen.h" #undef DID_IT #ifdef __sparc__ asm(" ;\ .globl strnlen ;\ strnlen: ;\ tst %o1 ;\ ble Ldone ;\ mov %o0,%o4 ;\ Lpreloop: ;\ andcc %o0,7,%g0 ;\ be Laligned ;\ nop ;\ ldub [%o0],%o2 ;\ tst %o2 ;\ be Ldone ;\ deccc %o1 ;\ bg Lpreloop ;\ inc %o0 ;\ Ldone: ;\ retl ;\ sub %o0,%o4,%o0 ;\ Laligned: ;\ cmp %o1,8 ;\ bl Ltrailer ;\ nop ;\ L8loop: ;\ ldd [%o0],%o2 ;\ srl %o2,4,%o5 ;\ or %o2,%o5,%o2 ;\ srl %o2,2,%o5 ;\ or %o2,%o5,%o2 ;\ srl %o2,1,%o5 ;\ or %o2,%o5,%o2 ;\ srl %o3,4,%o5 ;\ or %o3,%o5,%o3 ;\ srl %o3,2,%o5 ;\ or %o3,%o5,%o3 ;\ srl %o3,1,%o5 ;\ or %o3,%o5,%o3 ;\ set 0x01010101,%o5 ;\ and %o2,%o5,%o2 ;\ cmp %o2,%o5 ;\ bne Lfound1 ;\ and %o3,%o5,%o3 ;\ cmp %o3,%o5 ;\ bne Lfound2 ;\ subcc %o1,8,%o1 ;\ be Ldone ;\ add %o0,8,%o0 ;\ cmp %o1,8 ;\ bge L8loop ;\ nop ;\ Ltrailer: ;\ Ltrailloop: ;\ ldub [%o0],%o2 ;\ tst %o2 ;\ be Ldone ;\ deccc %o1 ;\ bg Ltrailloop ;\ inc %o0 ;\ b Ldone ;\ nop ;\ Lfound2: ;\ mov %o3,%o2 ;\ add %o0,4,%o0 ;\ Lfound1: ;\ set 0x01000000,%o5 ;\ Lfoundloop: ;\ andcc %o2,%o5,%g0 ;\ be Ldone ;\ sll %o2,8,%o2 ;\ b Lfoundloop ;\ inc %o0 ;\ "); #define DID_IT #endif #ifndef DID_IT int strnlen(const char *s, int limit) { int n; n = 0; while ((limit > 0) && *s) { s ++; limit --; n ++; } return(n); } #endif #ifdef TEST_STRNLEN #include #include #include #include static void failure(void) { abort(); } int main(void); int main(void) { char buf[256]; int len; int limit; int off; int des; int rv; #ifdef LOOPS for (off=0;off<8;off++) { for (limit=0;limit<32;limit++) { for (len=0;len<64;len++) { #endif buf[off+len] = '\0'; des = (len < limit) ? len : limit; #ifdef LOG_ALL printf("off=%d [%p], limit=%d, len=%d, des=%d, rv=",off,(void *)&buf[off],limit,len,des); fflush(stdout); rv = strnlen(&buf[off],limit); printf("%d\n",rv); if (rv != des) failure(); #else rv = strnlen(&buf[off],limit); if (rv != des) { printf("off=%d [%p], limit=%d, len=%d, des=%d, rv=%d\n",off,(void *)&buf[off],limit,len,des,rv); fflush(stdout); failure(); } #endif #ifdef LOOPS buf[off+len] = 'x'; } } } #endif #ifdef RANDOM srandom(time(0)); while (1) { off = random() & 7; limit = random() & 31; len = random() & 63; memset(&buf[off],'x',len); } #endif exit(0); } #endif