ФУНКЦИЯ СТРЛЕНА:
vxorps zmm0, zmm0, zmm0
vpcmpeqb k0, zmm0, [ebx+ eax] ; ebx = string (aligned at 64-byte boundary) | eax = length
kortestq k0, k0 ; 0x00 ?
jnz .search_for_0x00
.loop:
add eax, 64 ; len += 64
vxorps zmm0, zmm0, zmm0
vpcmpeqb k0, zmm0, [ebx+ eax]
kortestq k0, k0
здесь наша строка хранится в ebx
, а eax
- это наша длина ... ebx выровнен по границе 64 байт, поэтому мы можем использовать ее напрямую
Теперь мой вопрос: должен ли я использовать vxorps каждый раз в разделе 'loop'?
Поскольку я думаю, что * vpcmpeqb
'просто изменяет k0
, а не zmm0
.
Так что я думаю, что второй vxorps (в цикле) является дополнительным и должен быть удален, но я удалил его, и моя программа упала !!
Я не прав? 'vpcmpeqb
' тоже меняет zmm0
?