#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <x86intrin.h>
#include <inttypes.h>
#include <stdint.h>
#include <asm/types.h>
char szStr1[] = "10012121212121001";
size_t sseStrlen( const char* s ) {
__m128i zero = _mm_set1_epi8( 0 );
__m128i *s_aligned = (__m128i*) (((long)s) & -0x10L);
__u8 misbits = ((long)s) & 0xf;
__m128i s16cs = _mm_load_si128( s_aligned );
__m128i bytemask = _mm_cmpeq_epi8( s16cs, zero );
int bitmask = _mm_movemask_epi8( bytemask );
bitmask = (bitmask>>misbits)<<misbits;
while (bitmask==0) {
s16cs = _mm_load_si128( ++s_aligned );
bytemask = _mm_cmpeq_epi8( s16cs, zero );
bitmask = _mm_movemask_epi8( bytemask );
}
return ((( const char* ) s_aligned ) - s) + __builtin_ctz(bitmask);
}
int main()
{
int bRet=sseStrlen(szStr1);
printf("%d", bRet);
}
gcc -msse4.2 -Wmultichar -Wint-conversion -g ssestrlen.c