Code: Select all
Procedure.l STRLen(*pString)
!MOV eax, [esp]
!pxor mm1, mm1
!MOV ecx, eax
!MOV edx, eax
!AND ecx, -8
!AND eax, 7
!movq mm0, [ecx]
!por mm0, [stringtbl+eax*8]
!@@:
!ADD ecx, 8
!pcmpeqb mm0, mm1
!packsswb mm0, mm0
!movd eax, mm0
!movq mm0, [ecx]
!TEST eax, eax
!JZ @b
!BSF eax, eax
!SHR eax, 2
!LEA ecx, [ecx+eax-8]
!SUB ecx, edx
!MOV eax, ecx
!emms
ProcedureReturn
!stringtbl:
!dd 0, 0, 0, $FF
!dd 0, $FFFF, 0, $FFFFFF
!dd 0, $FFFFFFFF, $FF, $FFFFFFFF
!dd $FFFF, $FFFFFFFF, $FFFFFF, $FFFFFFFF
EndProcedure