| 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.