x86 비트 조작 명령 세트

x86 Bit manipulation instruction set

비트 조작 명령 세트(BMI 세트)는 인텔AMD 마이크로프로세서용 x86 명령 세트 아키텍처의 확장입니다.이 명령어 세트의 목적은 비트 조작 속도를 향상시키는 것입니다.이러한 세트의 모든 명령은 SIMD가 아니며 범용 레지스터에서만 작동합니다.

인텔은 BMI (여기서 BMI1)와 BMI2의 2가지 세트를 공개하고 있습니다.둘 다 Haswell 마이크로아키텍처(architecture)에서 도입되었습니다.AMD는 ABM(Advanced Bit Manipulation)과 TBM(Trailing Bit Manipulation) 두 세트를 공개했습니다.ABM은 SSE4.2 및 BMI1의 일부로 Intel에 의해 구현된 SSE4a의 서브셋이며, TBM(Trailing Bit Manipulation)은 BMI1의 확장으로 도입된 TBM(Trailing Bit Manipulation)입니다.

ABM(Advanced Bit Manifulation)

ABM은 AMD에 의해 단일 명령 세트로만 구현됩니다.모든 AMD 프로세서는 양쪽 명령을 모두 지원하거나 둘 다 지원하지 않습니다.인텔은POPCNTSSE4.2의 일부로서LZCNTBMI1의 일부로서.POPCNTCPUID 플래그가 따로 있지만 인텔은 AMD의 플래그를 사용합니다.ABM나타내는 플래그LZCNT서포트(이후)LZCNTABM을 [2]완료합니다).

부호화 설명 설명[3]
F3 0F B8 /r POPCNT 인구수
F3 0F BD /r LZCNT 선행 제로 수

LZCNT는 비트 스캔 리버스(BSR는, ZF(송신원이 제로인 경우)를 설정하는 것이 아니라, ZF(결과가 제로인 경우) 및 CF(송신원이 제로인 경우) 플래그를 설정합니다.또한 소스 오퍼랜드가 0일 경우 정의된 결과(비트 단위의 소스 오퍼랜드 크기)가 생성됩니다.0이 아닌 인수의 경우,LZCNT그리고.BSRresults는 인수 비트폭에서1을 뺀 값입니다(예를 들어 32비트 인수가0x000f0000, LZCNT 는 12, BSR 는 19) 를 지정합니다.

부호화LZCNTABM이 지원되지 않는 경우,BSR명령어가 대신 실행됩니다.[3]: 227

BMI1(비트 조작 명령 세트 1)

다음의 순서는, 에 의해서 유효하게 되어 있습니다.BMI비트는 CPUID에 포함되어 있습니다.인텔은 공식적으로LZCNTBMI의 일부로서, 그러나 광고한다.LZCNT를 사용한 지원ABM CPUID 기능 [2]플래그BMI1은 AMD[4]Jaguar, Piledriver[5] 및 그 이후의 프로세서와 인텔의 Haswell[6] 및 그 이후의 프로세서에서 사용할 수 있습니다.

부호화 설명 설명[2] 등가 C식[7][8]
VEX.LZ.0F38 F2 /r ANDN 논리적이고 비논리적이다 ~x & y
VEX.LZ.0F38 F7 /r BEXTR 비트 필드 추출(레지스터 포함) (src >> start) & ((1 << len) - 1)
VEX.LZ.0F38 F3 /3 BLSI 최저 세트 격리 비트 추출 x & -x
VEX.LZ.0F38 F3 /2 BLSMSK 가장 낮은 설정 비트까지 마스크 가져오기 x ^ (x - 1)
VEX.LZ.0F38 F3 /1 BLSR 최저 설정 비트 재설정 x & (x - 1)
F3 0F BC /r TZCNT 후행 0비트 수를 카운트합니다. 31 + (!x)
- (((x & -x) & 0x0000FFFF) ? 16 : 0)
- (((x & -x) & 0x00FF00FF) ? 8 : 0)
- (((x & -x) & 0x0F0F0F0F) ? 4 : 0)
- (((x & -x) & 0x33333333) ? 2 : 0)
- (((x & -x) & 0x55555555) ? 1 : 0)

TZCNT는 비트 스캔 포워드와 거의 동일합니다(BSF는, ZF(송신원이 제로인 경우)를 설정하는 것이 아니라, ZF(결과가 제로인 경우) 및 CF(송신원이 제로인 경우) 플래그를 설정합니다.0이 아닌 인수의 경우,TZCNT그리고.BSF동등합니다.

와 마찬가지로LZCNT, 부호화TZCNTBMI1이 지원되지 않는 경우,BSF명령어가 대신 실행됩니다.[3]: 352

BMI2(비트 조작 명령 세트 2)

인텔은 Haswell 프로세서 제품군에 BMI1과 함께 BMI2를 도입했습니다.AMD만이 BMI2를 사용하지 않고 BMI1을 지원하는 프로세서를 생산하고 있습니다.BMI2는 AMDs Excluverator 아키텍처 [9]이후에 지원됩니다.

부호화 설명 묘사
VEX.LZ.0F38 F5 /r BZHI 지정된 비트 위치 [src & ( 1 < inx )-1]부터 시작하는 하이비트 제로;
VEX.LZ.F2.0F38 F6 /r MULX 플래그 및 임의의 수신처 레지스터에 영향을 주지 않고 부호 없는 곱셈
VEX.LZ.F2.0F38 F5 /r PDEP 병렬 비트 퇴적물
VEX.LZ.F3.0F38 F5 /r PEXT 병렬 비트 추출
VEX.LZ.F2.0F3A F0 /r ib RORX 플래그에 영향을 주지 않고 논리적으로 오른쪽 회전
VEX.LZ.F3.0F38 F7 /r SARX 플래그에 영향을 주지 않고 산술 오른쪽으로 이동
VEX.LZ.F2.0F38 F7 /r SHRX 플래그에 영향을 주지 않고 논리적 권한 이동
VEX.LZ.66.0F38 F7 /r SHLX 플래그에 영향을 주지 않고 논리 왼쪽으로 이동

병렬 비트 증착 및 추출

PDEP그리고.PEXT명령어는 새로운 범용 비트레벨 압축 및 확장 명령입니다.두 가지 입력을 받습니다.하나는 소스이고 다른 하나는 셀렉터입니다.실렉터는 패킹 또는 언팩할 비트를 선택하는 비트맵입니다. PEXT는, 선택한 비트를 송신원으로부터 행선지의 연속하는 하위 비트에 카피합니다.상위 행선지 비트는 클리어 됩니다. PDEP는, 선택한 비트에 대해서 반대입니다.연속적인 하위 비트가 행선지의 선택된 비트에 복사됩니다.다른 행선지 비트는 클리어 됩니다.이것은 입력의 모든 비트필드를 추출하기 위해 사용할 수 있으며, 심지어 이전에는 비쌌을 많은 비트레벨의 shuffling을 실행할 수도 있습니다.이러한 명령어의 동작은 비트레벨의 수집 산란 SIMD 명령과 비슷하지만,PDEP그리고.PEXT(다른 BMI 명령 세트와 마찬가지로) 명령어는 범용 [10]레지스터에서 작동합니다.

지침은 32비트 및 64비트 버전으로 제공됩니다.32비트 모드에서 임의의 송신원과 실렉터를 사용하는 예를 다음에 나타냅니다.

설명 선택기 마스크 원천 목적지
PEXT 0xff00fff0 0x12345678 0x00012567
PDEP 0xff00fff0 0x00012567 0x12005670

PDEP 및 PEXT를 구현하는 Jen[11] 3 이전의 AMD 프로세서는 단일 사이클이 아닌 18 사이클의[12] 레이텐시로 마이크로 코드로 구현합니다.그 결과,[13] 이러한 프로세서에서 다른 명령을 사용하는 것이 많은 경우 더 빠릅니다.

TBM(트레이킹비트 조작)

TBM은 BMI1에 의해 시작된 명령어세트를 보완하는 명령어로 구성되어 있습니다.이 명령어 세트의 보완적인 성질은 명령어를 반드시 직접 사용할 필요는 없다는 것을 의미하지만 지원되면 최적화 컴파일러에 의해 생성될 수 있습니다.AMD는 TBM을 BMI1과 함께 Floodedriver[5] 시리즈 프로세서에 도입했습니다.나중에 AMD Jaguar 및 Zen 기반 프로세서는 TBM을 [4]지원하지 않습니다.(최소한 Coffee Lake 경유) TBM을 지원하는 인텔 프로세서는 없습니다.

부호화 설명 설명[3] 등가 C식[14]
XOP.LZ.0A 10 /r id BEXTR 비트 필드 추출(즉시 포함) (src >> start) & ((1 << len) - 1)
XOP.LZ.09 01 /1 BLCFILL 최저 클리어 비트부터 채우기 x & (x + 1)
XOP.LZ.09 02 /6 BLCI 최저 클리어 비트 분리 x ~(x + 1)
XOP.LZ.09 01 /5 BLCIC 최저 클리어 비트 및 보완을 격리합니다. ~x & (x + 1)
XOP.LZ.09 02 /1 BLCMSK 최저 클리어 비트의 마스크 x ^ (x + 1)
XOP.LZ.09 01 /3 BLCS 최저 클리어 비트 설정 x (x + 1)
XOP.LZ.09 01 /2 BLSFILL 가장 낮은 설정 비트부터 채우기 x (x - 1)
XOP.LZ.09 01 /6 BLSIC 최저 설정 비트 및 보완 비트 분리 ~x (x - 1)
XOP.LZ.09 01 /7 T1MSKC 후행 마스크의 역마스크 ~x (x + 1)
XOP.LZ.09 01 /4 TZMSK 후행 0의 마스크 ~x & (x - 1)

지원 CPU

  • 인텔(R)
    • Intel Nehalem 프로세서 이후 (Sandy Bridge, Ivy Bridge 등) (POPCNT 지원)
    • 인텔 Silvermont 프로세서 (POPCNT 지원)
    • 인텔 Haswell 프로세서 이후 (Skylake, Broadwell ) (ABM, BMI1, BMI2 지원)[6]
  • AMD
    • K10 기반 프로세서(ABM 지원)
    • "Cat" 저전력 프로세서
      • Bobcat 기반 프로세서(ABM 지원)[15]
      • Jaguar 기반 프로세서 이상(ABM 및 BMI1 지원)[4]
      • Puma 기반 프로세서 이후 (ABM 및 BMI1 지원)[4]
    • '중장비' 프로세서
      • 불도저 기반 프로세서(ABM 지원)
      • 스택드라이버 기반 프로세서(ABM, BMI1, TBM 지원)[1]
      • 스팀 롤러 기반 프로세서(ABM, BMI1, TBM 지원)
      • 굴착기 기반 프로세서 이후 (ABM, BMI1, BMI2, TBM 지원, 마이크로코드 PEXT 및 PDEP)[9]
    • Zen 기반, Zen+ 기반 및 Zen 2 기반[16] 프로세서(ABM, BMI1, BMI2 지원, 마이크로코드 PEXT 및 PDEP)
    • Zen 3 프로세서 이후 (ABM, BMI1, BMI2 지원, 완전한 하드웨어 구현)

명령 확장 지원은 프로세서가 소프트웨어 호환성을 위해 지원되는 명령을 실행할 수 있음을 의미합니다.CPU가 제대로 작동하지 않을 수 있습니다.예를 들어, Excluverator through Zen 2 프로세서는 마이크로코드를 사용하여 PEXT 및 PDEP 명령을 구현하므로 다른 [17]명령을 사용하여 재현한 동일한 동작보다 실행 속도가 크게 느려집니다.(이러한 머신에서는, 「zp7」이라고 불리는 소프트웨어 방법이, 실제로는 고속입니다).[18]최적의 퍼포먼스를 얻기 위해 컴파일러 개발자는 확장의 가용성이 아닌 아키텍처 고유의 퍼포먼스 프로파일을 기반으로 확장에서 개별 명령을 사용하는 것이 좋습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "New "Bulldozer" and "Piledriver" Instructions" (PDF). Retrieved 2014-01-03.
  2. ^ a b c "Intel Advanced Vector Extensions Programming Reference" (PDF). intel.com. Intel. June 2011. Retrieved 2014-01-03.
  3. ^ a b c d "AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions" (PDF). Revision 3.32. AMD. March 2021. Archived (PDF) from the original on 2021-04-08. Retrieved 2021-04-08.
  4. ^ a b c d "Family 16h AMD A-Series Data Sheet" (PDF). amd.com. AMD. October 2013. Retrieved 2014-01-02.
  5. ^ a b Hollingsworth, Brent. "New "Bulldozer" and "Piledriver" instructions" (PDF). Advanced Micro Devices, Inc. Retrieved 11 December 2014.
  6. ^ a b Locktyukhin, Max. "How to detect New Instruction support in the 4th generation Intel® Core™ processor family". www.intel.com. Intel. Retrieved 11 December 2014.
  7. ^ "bmiintrin.h from GCC 4.8". Retrieved 2014-03-17.
  8. ^ "Abseil - C++ Common Libraries". GitHub. 4 November 2021.
  9. ^ a b "AMD Excavator Core May Bring Dramatic Performance Increases". X-bit labs. October 18, 2013. Archived from the original on October 23, 2013. Retrieved November 24, 2013.
  10. ^ Yedidya Hilewitz; Ruby B. Lee (August 2009). "A New Basis for Shifters in General-Purpose Processors for Existing and Advanced Bit Manipulations" (PDF). palms.princeton.edu. IEEE Transactions on Computers. pp. 1035–1048. Retrieved 2014-02-10.
  11. ^ "Zen 3 - Microarchitectures - AMD - WikiChip".
  12. ^ https://www.agner.org/optimize/instruction_tables.pdf[베어 URL PDF]
  13. ^ "Saving Private Ryzen: PEXT/PDEP 32/64b replacement functions for #AMD CPUs (BR/#Zen/Zen+/#Zen2) based on @zwegner's zp7". Twitter. Retrieved 2022-02-21.
  14. ^ "tbmintrin.h from GCC 4.8". Retrieved 2014-03-17.
  15. ^ "BIOS and Kernel Developer's Guide for AMD Family 14h" (PDF). Retrieved 2014-01-03.
  16. ^ "AMD Zen 3 Ryzen Deep Dive Review: 5950X, 5900X, 5800X and 5600X Tested". Retrieved 2021-12-26.
  17. ^ "Dolphin Progress Report: December 2019 and January 2020". Dolphin Emulator. 7 February 2020. Retrieved 2020-02-07.
  18. ^ Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub.

추가 정보

외부 링크