AVX512BW : bsf / tzcnt를 사용하여 32 비트 코드에서 64 비트 마스크 처리?

ELHASKSERVERS

이것은 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

32 비트 바이너리를 사용하여 64 비트 시스템에서 ac 프로그램 컴파일

분류에서Dev

-m64를 사용하여 32 비트 시스템에서 64 비트 컴파일 오류

분류에서Dev

npm을 사용하여 64 비트 시스템에서 32 비트 바이너리를 어떻게 빌드합니까?

분류에서Dev

VirtualBox를 사용하여 64 비트 호스트에 32 비트 Ubuntu를 설치할 수 있습니까?

분류에서Dev

64 비트 Windows 컴퓨터에서 32 비트 Nasm 어셈블리 개체 코드를 연결하는 방법

분류에서Dev

64 비트 서비스에서 32 비트 DLL을 사용하는 포인터

분류에서Dev

소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

분류에서Dev

소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

분류에서Dev

32 비트 iPhone에서 64 비트 정수 처리

분류에서Dev

Windows / Linux에서 python3 스크립트를 사용하여 실행 파일이 32 비트인지 64 비트인지 확인

분류에서Dev

64 비트 컴퓨터에서 4 비트, 8 비트, 16 비트 또는 32 비트 크기의 포인터를 사용할 수 있습니까?

분류에서Dev

마이크로 서비스 (ZeroMQ, C 및 Python 프로세스 사용)를 64 비트 하드웨어에서 32 비트 하드웨어로 이동 한 후 지연 시간, 그러나 공칭 CPU 사용량

분류에서Dev

32 비트 시스템에 64 비트 라이브러리를 설치하는 방법은 무엇입니까?

분류에서Dev

컴퓨터에 32 비트 및 64 비트 리소스를 모두 설치하는 msi 패키지 만들기

분류에서Dev

64 비트 모드에서 64 비트 대신 어셈블리 32 비트 주소 지정 크기

분류에서Dev

Ubuntu 12.04 32 비트 컴퓨터에서 시동 디스크 생성기 유틸리티를 사용하여 Ubuntu 16.04 64 비트 부팅 가능 USB 드라이브 만들기

분류에서Dev

COM 대리를 통해 64 비트에서 사용할 32 비트 COM 클래스를 등록하는 도구가 있습니까?

분류에서Dev

COM 대리를 통해 64 비트에서 사용할 32 비트 COM 클래스를 등록하는 도구가 있습니까?

분류에서Dev

C ++ 64 비트 시스템에서 32 비트 바이너리 빌드

분류에서Dev

64 비트에서 32 비트 버전의 Python 코드를 만드는 방법

분류에서Dev

64 비트 UEFI 시스템에서 bootia32.efi를 사용하여 Windows 10 부팅

분류에서Dev

Redis Pubsub에서 이벤트를 처리하는 마이크로 서비스

분류에서Dev

Java Web Start를 사용하여 32 비트 및 64 비트 JVM에 대해 서로 다른 최대 힙 크기를 가질 수 있습니까?

분류에서Dev

VBA API 레지스트리에서 값 읽기 32 비트 및 64 비트

분류에서Dev

zypper를 사용하여 64 비트 SUSE 시스템에 32 비트 패키지를 설치하려면 어떻게해야합니까?

분류에서Dev

32 비트 아키텍처에서 64 비트 앱을 실행하는 방법

분류에서Dev

NSIS를 사용하여 Windows 32 비트 또는 64 비트 감지

분류에서Dev

64 비트 프로세스가 32 비트 레지스트리 하이브에 쓰는 이유

분류에서Dev

Windows 7 (32 비트 및 64 비트) 컴퓨터에서 사용하기 위해 C ++ Builder 5에서 코드를 컴파일 할 수 있습니까?

Related 관련 기사

  1. 1

    32 비트 바이너리를 사용하여 64 비트 시스템에서 ac 프로그램 컴파일

  2. 2

    -m64를 사용하여 32 비트 시스템에서 64 비트 컴파일 오류

  3. 3

    npm을 사용하여 64 비트 시스템에서 32 비트 바이너리를 어떻게 빌드합니까?

  4. 4

    VirtualBox를 사용하여 64 비트 호스트에 32 비트 Ubuntu를 설치할 수 있습니까?

  5. 5

    64 비트 Windows 컴퓨터에서 32 비트 Nasm 어셈블리 개체 코드를 연결하는 방법

  6. 6

    64 비트 서비스에서 32 비트 DLL을 사용하는 포인터

  7. 7

    소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

  8. 8

    소프트웨어 RAID를 사용하여 Ubuntu 32 비트에서 64 비트로 업그레이드

  9. 9

    32 비트 iPhone에서 64 비트 정수 처리

  10. 10

    Windows / Linux에서 python3 스크립트를 사용하여 실행 파일이 32 비트인지 64 비트인지 확인

  11. 11

    64 비트 컴퓨터에서 4 비트, 8 비트, 16 비트 또는 32 비트 크기의 포인터를 사용할 수 있습니까?

  12. 12

    마이크로 서비스 (ZeroMQ, C 및 Python 프로세스 사용)를 64 비트 하드웨어에서 32 비트 하드웨어로 이동 한 후 지연 시간, 그러나 공칭 CPU 사용량

  13. 13

    32 비트 시스템에 64 비트 라이브러리를 설치하는 방법은 무엇입니까?

  14. 14

    컴퓨터에 32 비트 및 64 비트 리소스를 모두 설치하는 msi 패키지 만들기

  15. 15

    64 비트 모드에서 64 비트 대신 어셈블리 32 비트 주소 지정 크기

  16. 16

    Ubuntu 12.04 32 비트 컴퓨터에서 시동 디스크 생성기 유틸리티를 사용하여 Ubuntu 16.04 64 비트 부팅 가능 USB 드라이브 만들기

  17. 17

    COM 대리를 통해 64 비트에서 사용할 32 비트 COM 클래스를 등록하는 도구가 있습니까?

  18. 18

    COM 대리를 통해 64 비트에서 사용할 32 비트 COM 클래스를 등록하는 도구가 있습니까?

  19. 19

    C ++ 64 비트 시스템에서 32 비트 바이너리 빌드

  20. 20

    64 비트에서 32 비트 버전의 Python 코드를 만드는 방법

  21. 21

    64 비트 UEFI 시스템에서 bootia32.efi를 사용하여 Windows 10 부팅

  22. 22

    Redis Pubsub에서 이벤트를 처리하는 마이크로 서비스

  23. 23

    Java Web Start를 사용하여 32 비트 및 64 비트 JVM에 대해 서로 다른 최대 힙 크기를 가질 수 있습니까?

  24. 24

    VBA API 레지스트리에서 값 읽기 32 비트 및 64 비트

  25. 25

    zypper를 사용하여 64 비트 SUSE 시스템에 32 비트 패키지를 설치하려면 어떻게해야합니까?

  26. 26

    32 비트 아키텍처에서 64 비트 앱을 실행하는 방법

  27. 27

    NSIS를 사용하여 Windows 32 비트 또는 64 비트 감지

  28. 28

    64 비트 프로세스가 32 비트 레지스트리 하이브에 쓰는 이유

  29. 29

    Windows 7 (32 비트 및 64 비트) 컴퓨터에서 사용하기 위해 C ++ Builder 5에서 코드를 컴파일 할 수 있습니까?

뜨겁다태그

보관