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 프로세서는 양쪽 명령을 모두 지원하거나 둘 다 지원하지 않습니다.인텔은POPCNT
SSE4.2의 일부로서LZCNT
BMI1의 일부로서.POPCNT
CPUID 플래그가 따로 있지만 인텔은 AMD의 플래그를 사용합니다.ABM
나타내는 플래그LZCNT
서포트(이후)LZCNT
ABM을 [2]완료합니다).
부호화 | 설명 | 설명[3] |
---|---|---|
F3 0F B8 /r | POPCNT | 인구수 |
F3 0F BD /r | LZCNT | 선행 제로 수 |
LZCNT
는 비트 스캔 리버스(BSR
는, ZF(송신원이 제로인 경우)를 설정하는 것이 아니라, ZF(결과가 제로인 경우) 및 CF(송신원이 제로인 경우) 플래그를 설정합니다.또한 소스 오퍼랜드가 0일 경우 정의된 결과(비트 단위의 소스 오퍼랜드 크기)가 생성됩니다.0이 아닌 인수의 경우,LZCNT
그리고.BSR
results는 인수 비트폭에서1을 뺀 값입니다(예를 들어 32비트 인수가0x000f0000
, LZCNT 는 12, BSR 는 19) 를 지정합니다.
부호화LZCNT
ABM이 지원되지 않는 경우,BSR
명령어가 대신 실행됩니다.[3]: 227
BMI1(비트 조작 명령 세트 1)
다음의 순서는, 에 의해서 유효하게 되어 있습니다.BMI
비트는 CPUID에 포함되어 있습니다.인텔은 공식적으로LZCNT
BMI의 일부로서, 그러나 광고한다.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
, 부호화TZCNT
BMI1이 지원되지 않는 경우,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)
- AMD
명령 확장 지원은 프로세서가 소프트웨어 호환성을 위해 지원되는 명령을 실행할 수 있음을 의미합니다.CPU가 제대로 작동하지 않을 수 있습니다.예를 들어, Excluverator through Zen 2 프로세서는 마이크로코드를 사용하여 PEXT 및 PDEP 명령을 구현하므로 다른 [17]명령을 사용하여 재현한 동일한 동작보다 실행 속도가 크게 느려집니다.(이러한 머신에서는, 「zp7」이라고 불리는 소프트웨어 방법이, 실제로는 고속입니다).[18]최적의 퍼포먼스를 얻기 위해 컴파일러 개발자는 확장의 가용성이 아닌 아키텍처 고유의 퍼포먼스 프로파일을 기반으로 확장에서 개별 명령을 사용하는 것이 좋습니다.
「 」를 참조해 주세요.
- Advanced Vector Extensions(AVX)
- AES 명령 세트
- CLMUL 명령 집합
- F16C
- FMA 명령 세트
- 인텔 ADX
- XOP 명령 세트
- 인텔 BCD opcode (고도의 비트 조작 기술에도 사용)
레퍼런스
- ^ a b "New "Bulldozer" and "Piledriver" Instructions" (PDF). Retrieved 2014-01-03.
- ^ a b c "Intel Advanced Vector Extensions Programming Reference" (PDF). intel.com. Intel. June 2011. Retrieved 2014-01-03.
- ^ 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.
- ^ a b c d "Family 16h AMD A-Series Data Sheet" (PDF). amd.com. AMD. October 2013. Retrieved 2014-01-02.
- ^ a b Hollingsworth, Brent. "New "Bulldozer" and "Piledriver" instructions" (PDF). Advanced Micro Devices, Inc. Retrieved 11 December 2014.
- ^ 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.
- ^ "bmiintrin.h from GCC 4.8". Retrieved 2014-03-17.
- ^ "Abseil - C++ Common Libraries". GitHub. 4 November 2021.
- ^ 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.
- ^ 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.
- ^ "Zen 3 - Microarchitectures - AMD - WikiChip".
- ^ https://www.agner.org/optimize/instruction_tables.pdf[베어 URL PDF]
- ^ "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.
- ^ "tbmintrin.h from GCC 4.8". Retrieved 2014-03-17.
- ^ "BIOS and Kernel Developer's Guide for AMD Family 14h" (PDF). Retrieved 2014-01-03.
- ^ "AMD Zen 3 Ryzen Deep Dive Review: 5950X, 5900X, 5800X and 5600X Tested". Retrieved 2021-12-26.
- ^ "Dolphin Progress Report: December 2019 and January 2020". Dolphin Emulator. 7 February 2020. Retrieved 2020-02-07.
- ^ Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub.
추가 정보
- Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8.