SSE4: PTEST & strlen

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.