Autor: | Wojciech Muła |
---|---|
Dodany: | 8.09.2007 |
Realizacja funkcji strlen z użyciem nowego rozkazu PTEST. Zobacz również projekt sse2string.
# size_t strlen(const char *s); # # args: # - %edx - s # return: # - %eax sse4_strlen: pxor %xmm0, %xmm0 # xmm0 := packed_byte(0x00) xor %eax, %eax # eax := length .L_mainloop: movaps (%eax, %edx), %xmm1 add $16, %eax pcmpeqb %xmm0, %xmm1 # 0xff for nulls ptest %xmm1, %xmm0 # CF := 1 when # (NOT xmm0) AND xmm1 = 0 # # CF = 1 -- no zeros found # = 0 -- otherwise jc .L_mainloop pmovmskb %xmm1, %edx # bsf %edx, %edx # get null position lea -16(%edx, %eax), %eax # and update length ret
Opóźnienie PTEST wynosi 1 cykl.