Befehlssatz zur Bitmanipulation - Bit manipulation instruction set
Bitmanipulation Instruction Sets ( BMI-Sets ) sind Erweiterungen der x86- Befehlssatzarchitektur für Mikroprozessoren von Intel und AMD . Der Zweck dieser Befehlssätze besteht darin, die Geschwindigkeit der Bitmanipulation zu verbessern . Alle Anweisungen in dieser Sätze sind nicht SIMD und arbeiten nur auf Allzweck- Register .
Es gibt zwei von Intel veröffentlichte Sätze: BMI (hier als BMI1 bezeichnet) und BMI2; beide wurden mit der Haswell- Mikroarchitektur eingeführt. Weitere zwei Sätze wurden von AMD veröffentlicht: ABM ( Advanced Bit Manipulation , die auch eine Teilmenge von SSE4a ist, die von Intel als Teil von SSE4.2 und BMI1 implementiert wurde) und TBM ( Trailing Bit Manipulation , eine Erweiterung, die mit Piledriver- basierten Prozessoren als eine Erweiterung zu BMI1, fiel aber bei Zen- basierten Prozessoren wieder weg).
ABM (Erweiterte Bit-Manipulation)
ABM wird von AMD nur als einzelner Befehlssatz implementiert; alle AMD-Prozessoren unterstützen beide Anweisungen oder keine. Intel betrachtet es POPCNT
als Teil von SSE4.2 und LZCNT
als Teil von BMI1. POPCNT
hat ein separates CPUID- Flag; Intel verwendet jedoch das ABM
Flag von AMD , um LZCNT
Unterstützung anzuzeigen (da LZCNT
das ABM abgeschlossen ist).
Codierung | Anweisung | Beschreibung |
---|---|---|
F3 0F B8 /r
|
POPCNT
|
Bevölkerungszahl |
F3 0F BD /r
|
LZCNT
|
Führende Nullen zählen |
LZCNT
bezieht sich auf den Bit Scan Reverse ( BSR
)-Befehl, setzt aber die ZF- (wenn das Ergebnis null ist) und CF (wenn die Quelle null ist)-Flags, anstatt das ZF (wenn die Quelle null ist) zu setzen. Außerdem erzeugt es ein definiertes Ergebnis (die Quelloperandengröße in Bits), wenn der Quelloperand null ist. Bei einem Argument ungleich Null ist die Summe von LZCNT
und das BSR
Ergebnis die Argument-Bitbreite minus 1 (wenn beispielsweise das 32-Bit-Argument ist 0x000f0000
, ergibt LZCNT 12 und BSR 19).
Die Codierung von LZCNT
ist so, dass, wenn ABM nicht unterstützt wird, der BSR
Befehl stattdessen ausgeführt wird.
BMI1 (Bit-Manipulations-Befehlssatz 1)
Die folgenden Anweisungen sind diejenigen, die durch das BMI
Bit in CPUID aktiviert werden . Intel betrachtet es offiziell LZCNT
als Teil des BMI, wirbt jedoch für die LZCNT
Unterstützung mit dem ABM
CPUID-Feature-Flag. BMI1 ist in AMDs Jaguar , Piledriver und neueren Prozessoren sowie in Intels Haswell und neueren Prozessoren verfügbar .
Codierung | Anweisung | Beschreibung | Äquivalenter C-Ausdruck |
---|---|---|---|
VEX.LZ.0F38 F2 /r
|
ANDN
|
Logisch und nicht |
~x & y
|
VEX.LZ.0F38 F7 /r
|
BEXTR
|
Bitfeldauszug (mit Register) |
(src >> start) & ((1 << len) - 1)
|
VEX.LZ.0F38 F3 /3
|
BLSI
|
Extrahiert das niedrigste isolierte Bit |
x & -x
|
VEX.LZ.0F38 F3 /2
|
BLSMSK
|
Maske auf das niedrigste gesetzte Bit bringen |
x ^ (x - 1)
|
VEX.LZ.0F38 F3 /1
|
BLSR
|
Niedrigstes gesetztes Bit zurücksetzen |
x & (x - 1)
|
F3 0F BC /r
|
TZCNT
|
Zählen Sie die Anzahl der nachgestellten Nullbits |
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
ist fast identisch mit dem Bit Scan Forward ( BSF
)-Befehl, setzt jedoch die ZF- (wenn das Ergebnis null ist) und CF (wenn die Quelle null ist)-Flags, anstatt die ZF (wenn die Quelle null ist) zu setzen. Bei einem Argument ungleich Null ist das Ergebnis von TZCNT
und BSF
gleich.
Wie bei LZCNT
ist die Codierung von TZCNT
so, dass, wenn BMI1 nicht unterstützt wird, der BSF
Befehl stattdessen ausgeführt wird.
BMI2 (Bit-Manipulations-Befehlssatz 2)
Intel hat BMI2 zusammen mit BMI1 in seiner Reihe von Haswell-Prozessoren eingeführt. Nur AMD hat Prozessoren produziert, die BMI1 ohne BMI2 unterstützen; BMI2 wird von AMDs Excavator- Architektur und neuer unterstützt.
Codierung | Anweisung | Beschreibung |
---|---|---|
VEX.LZ.0F38 F5 /r
|
BZHI
|
Null High-Bits beginnend mit der angegebenen Bitposition [src & (1 << inx)-1]; |
VEX.LZ.F2.0F38 F6 /r
|
MULX
|
Vorzeichenlose Multiplikation ohne Auswirkungen auf Flags und beliebige Zielregister |
VEX.LZ.F2.0F38 F5 /r
|
PDEP
|
Einzahlung von parallelen Bits |
VEX.LZ.F3.0F38 F5 /r
|
PEXT
|
Extrahieren von parallelen Bits |
VEX.LZ.F2.0F3A F0 /r ib
|
RORX
|
Logisch nach rechts drehen, ohne Flags zu beeinflussen |
VEX.LZ.F3.0F38 F7 /r
|
SARX
|
Arithmetik nach rechts verschieben, ohne Flags zu beeinflussen |
VEX.LZ.F2.0F38 F7 /r
|
SHRX
|
Logisch nach rechts verschieben, ohne Flags zu beeinflussen |
VEX.LZ.66.0F38 F7 /r
|
SHLX
|
Logisch nach links verschieben, ohne Flags zu beeinflussen |
Parallele Bitablage und -extraktion
Die Befehle PDEP
und PEXT
sind neue verallgemeinerte Komprimierungs- und Erweiterungsbefehle auf Bitebene. Sie nehmen zwei Eingaben entgegen; einer ist eine Quelle und der andere ist ein Selektor. Der Selektor ist eine Bitmap, die die Bits auswählt, die gepackt oder entpackt werden sollen. PEXT
kopiert ausgewählte Bits von der Quelle in zusammenhängende Bits niedriger Ordnung des Ziels; höherwertige Zielbits werden gelöscht. PDEP
macht das Gegenteil für die ausgewählten Bits: zusammenhängende Bits niedriger Ordnung werden in ausgewählte Bits des Ziels kopiert; andere Zielbits werden gelöscht. Dies kann verwendet werden, um jedes Bitfeld der Eingabe zu extrahieren und sogar viele Umordnungen auf Bitebene durchzuführen, die zuvor teuer gewesen wären. Während das, was diese Befehle tun, ähnlich ist wie bei SIMD-Befehlen zum Sammeln und Streuen auf Bitebene , PDEP
und PEXT
Befehle (wie der Rest der BMI-Befehlssätze) arbeiten auf Allzweckregistern.
Die Anweisungen sind in 32-Bit- und 64-Bit-Versionen verfügbar. Ein Beispiel für die Verwendung einer beliebigen Quelle und eines Selektors im 32-Bit-Modus ist:
Anweisung | Auswahlmaske | Quelle | Ziel |
---|---|---|---|
PEXT |
0xff00fff0 |
0x12345678 |
0x00012567
|
PDEP |
0xff00fff0 |
0x00012567 |
0x12005670
|
AMD-Prozessoren vor Zen 3, die PDEP und PEXT implementieren, tun dies in Mikrocode, mit einer Latenz von 18 Zyklen anstelle eines einzelnen Zyklus. Infolgedessen ist es bei bekannter Maske oft schneller, andere Anweisungen auf AMD zu verwenden.
TBM (Trailing-Bit-Manipulation)
TBM besteht aus Anweisungen, die den von BMI1 gestarteten Befehlssatz ergänzen; ihre komplementäre Natur bedeutet, dass sie nicht unbedingt direkt verwendet werden müssen, sondern von einem optimierenden Compiler generiert werden können, wenn sie unterstützt werden. AMD hat TBM zusammen mit BMI1 in seiner Piledriver- Prozessorlinie eingeführt; spätere AMD Jaguar- und Zen-basierte Prozessoren unterstützen TBM nicht. Keine Intel-Prozessoren (zumindest durch Coffee Lake) unterstützen TBM.
Codierung | Anweisung | Beschreibung | Äquivalenter C-Ausdruck |
---|---|---|---|
XOP.LZ.0A 10 /r id
|
BEXTR
|
Bitfeldauszug (mit Sofort) |
(src >> start) & ((1 << len) - 1)
|
XOP.LZ.09 01 /1
|
BLCFILL
|
Füllen Sie vom niedrigsten freien Bit |
x & (x + 1)
|
XOP.LZ.09 02 /6
|
BLCI
|
Unterstes klares Bit isolieren |
x | ~(x + 1)
|
XOP.LZ.09 01 /5
|
BLCIC
|
Unterstes klares Bit isolieren und ergänzen |
~x & (x + 1)
|
XOP.LZ.09 02 /1
|
BLCMSK
|
Maske vom niedrigsten Clear-Bit |
x ^ (x + 1)
|
XOP.LZ.09 01 /3
|
BLCS
|
Niedrigstes Clear-Bit setzen |
x | (x + 1)
|
XOP.LZ.09 01 /2
|
BLSFILL
|
Füllen vom niedrigsten gesetzten Bit |
x | (x - 1)
|
XOP.LZ.09 01 /6
|
BLSIC
|
Isolieren Sie das niedrigste Bit und das Komplement |
~x | (x - 1)
|
XOP.LZ.09 01 /7
|
T1MSKC
|
Inverse Maske von nachgestellten |
~x | (x + 1)
|
XOP.LZ.09 01 /4
|
TZMSK
|
Maskieren von nachgestellten Nullen |
~x & (x - 1)
|
Unterstützte CPUs
-
Intel
- Intel Nehalem- Prozessoren und neuer (wie Sandy Bridge , Ivy Bridge ) (POPCNT unterstützt)
- Intel Silvermont- Prozessoren (POPCNT unterstützt)
- Intel Haswell- Prozessoren und neuer (wie Skylake , Broadwell ) (ABM, BMI1 und BMI2 unterstützt)
-
AMD
- K10-basierte Prozessoren (ABM unterstützt)
- "Cat"-Prozessoren mit geringem Stromverbrauch
- Bobcat-basierte Prozessoren (ABM unterstützt)
- Jaguar-basierte Prozessoren und neuer (ABM und BMI1 unterstützt)
- Puma-basierte Prozessoren und neuer (ABM und BMI1 unterstützt)
- "Heavy Equipment"-Prozessoren
- Bulldozer-basierte Prozessoren (ABM unterstützt)
- Piledriver-basierte Prozessoren (ABM, BMI1 und TBM unterstützt)
- Steamroller-basierte Prozessoren (ABM, BMI1 und TBM unterstützt)
- Bagger basierte Prozessoren und neuere (ABM, BMI1, BMI2 und TBM unterstützt; mikrocodierter PEXT und PDEP)
- Zen-basiert , Zen+-basiert und Prozessoren (ABM, BMI1 und BMI2 unterstützt; mikrocodiertes PEXT und PDEP)
- Zen 3- Prozessoren und neuer (ABM, BMI1 und BMI2 unterstützt; vollständige Hardwareimplementierung)
Beachten Sie, dass die Unterstützung der Befehlserweiterung bedeutet, dass der Prozessor die unterstützten Befehle aus Gründen der Softwarekompatibilität ausführen kann. Der Prozessor funktioniert dabei möglicherweise nicht optimal. Zum Beispiel implementieren Excavator- bis Zen-2-Prozessoren PEXT- und PDEP-Befehle unter Verwendung von Mikrocode, was dazu führt, dass die Befehle wesentlich langsamer ausgeführt werden als das gleiche Verhalten, das mit anderen Befehlen neu erstellt wird. (Eine Softwaremethode namens "zp7" ist auf diesen Maschinen tatsächlich schneller.) Für eine optimale Leistung wird Compilerentwicklern empfohlen, einzelne Anweisungen in den Erweiterungen basierend auf architekturspezifischen Leistungsprofilen und nicht auf der Verfügbarkeit der Erweiterungen zu verwenden.
Siehe auch
- Erweiterte Vektorerweiterungen (AVX)
- AES-Befehlssatz
- CLMUL-Befehlssatz
- F16C
- FMA-Befehlssatz
- Intel ADX
- XOP-Befehlssatz
- Intel BCD-Opcodes (auch für fortgeschrittene Bit-Manipulationstechniken verwendet)
Verweise
Weiterlesen
- Warren Jr., Henry S. (2013). Hacker's Delight (2 Aufl.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8.