이것은 AVX512BW의 'strlen'기능에 대한 내 코드입니다.
vxorps zmm0, zmm0, zmm0 ; ZMM0 = 0
vpcmpeqb k0, zmm0, [ebx] ; ebx is string and it's aligned at 64-byte boundary
kortestq k0, k0 ; 0x00 found ?
jnz .chk_0x00
이제 'chk_0x00'의 경우 x86_64 시스템에서는 문제가 없으며 다음과 같이 처리 할 수 있습니다.
chk_0x00:
kmovq rbx, k0
tzcnt rbx, rbx
add rax, rbx
여기에 64 비트 레지스터가 있으므로 마스크를 저장할 수 있지만 제 질문은 64 비트 레지스터가없는 x86 시스템에 관한 것이므로 '메모리'예약 (8 바이트)을 사용하고 둘 다 확인해야합니다. 마스크의 DWORD (사실이게 내 방식이고 더 좋은 방법이 있는지 알고 싶어요)
chk_0x00:
kmovd ebx, k0 ; move the first dword of the mask to the ebx
test ebx, ebx ; 0x00 found in the first dword ?
jz .check_next_dword
bsf ebx, ebx
add eax, ebx
jmp .done
.check_next_dword:
add eax, 32 ; 0x00 is not found in the first DWORD of the mask so we pass it by adding 32 to the length
sub esp, 8 ; reserve 8-byte from memory
kmovq [esp], k0 ; move the 8-byte MASK from k0 to our reserved memory
mov ebx, [esp+4] ; move the second DWORD of the mask to the ebx
bsf ebx, ebx
add eax, ebx
add esp, 8
내 x86 방식으로 'kmovd'를 사용하여 마스크의 첫 번째 DWORD를 ebx로 이동했지만 마스크의 두 번째 DWORD를 위해 무엇을해야하는지 모르겠습니다 !!! 그래서 방금 메모리에서 8 바이트를 예약하고 마스크 (8 바이트)를 그 안으로 옮긴 다음 두 번째 dword를 ebx로 이동하고 다시 확인했습니다 ... 더 나은 해결책이 있습니까? (내 방식이 충분히 빠르지 않다고 생각합니다) 또한 레지스터를 0 vxorps
으로 초기화하는 데 사용 하는 것이 사실 zmm
입니까?
KSHIFTRQ를 대안으로 사용할 수있는 것처럼 보입니다. 상위 32 비트 k0
카운터를 하위 32 비트로 오른쪽 이동 하여 일반 용도 레지스터에 복사 할 수 있습니다. 처럼:
.check_next_dword:
add eax, 32
KSHIFTRQ k0, k0, 32 ;shift hi 32 bits to be low 32 bits
kmovd ebx, k0
...
그리고 예, vxorps 참조 에 따르면 마스크없이 3 번째 인수로 xor-ing하므로 0으로 vxorps zmm0, zmm0, zmm0
설정 zmm0
됩니다 ( zmm 레지스터 제로화에 대한 이 SO 질문 도 확인할 수 있습니다 )
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다