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 POPCNTals Teil von SSE4.2 und LZCNTals Teil von BMI1. POPCNThat ein separates CPUID- Flag; Intel verwendet jedoch das ABMFlag von AMD , um LZCNTUnterstützung anzuzeigen (da LZCNTdas ABM abgeschlossen ist).

Codierung Anweisung Beschreibung
F3 0F B8 /r POPCNT Bevölkerungszahl
F3 0F BD /r LZCNT Führende Nullen zählen

LZCNTbezieht 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 LZCNTund das BSRErgebnis die Argument-Bitbreite minus 1 (wenn beispielsweise das 32-Bit-Argument ist 0x000f0000, ergibt LZCNT 12 und BSR 19).

Die Codierung von LZCNTist so, dass, wenn ABM nicht unterstützt wird, der BSRBefehl stattdessen ausgeführt wird.

BMI1 (Bit-Manipulations-Befehlssatz 1)

Die folgenden Anweisungen sind diejenigen, die durch das BMIBit in CPUID aktiviert werden . Intel betrachtet es offiziell LZCNTals Teil des BMI, wirbt jedoch für die LZCNTUnterstützung mit dem ABMCPUID-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)

TZCNTist 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 TZCNTund BSFgleich.

Wie bei LZCNTist die Codierung von TZCNTso, dass, wenn BMI1 nicht unterstützt wird, der BSFBefehl 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 PDEPund PEXTsind 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. PEXTkopiert ausgewählte Bits von der Quelle in zusammenhängende Bits niedriger Ordnung des Ziels; höherwertige Zielbits werden gelöscht. PDEPmacht 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 , PDEPund PEXTBefehle (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

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

Verweise

Weiterlesen

Externe Links