x86-bitars manipulationsinstruktionsuppsättning

Bitmanipulationsinstruktionsuppsättningar ( BMI-uppsättningar ) är tillägg till x86- instruktionsuppsättningsarkitekturen för mikroprocessorer från Intel och AMD . Syftet med dessa instruktionsuppsättningar är att förbättra hastigheten för bitmanipulering . Alla instruktioner i dessa uppsättningar är icke- SIMD och fungerar endast på allmänna register .

Det finns två uppsättningar publicerade av Intel: BMI (nu kallat BMI1) och BMI2; de introducerades båda med Haswell -mikroarkitekturen med BMI1-matchande funktioner som erbjuds av AMD:s ABM-instruktionsuppsättning och BMI2 som utökar dem. Ytterligare två uppsättningar publicerades av AMD: ABM ( Advanced Bit Manipulation , som också är en delmängd av SSE4a implementerad av Intel som en del av SSE4.2 och BMI1), och TBM ( Trailing Bit Manipulation , en förlängning som introduceras med Piledriver -baserade processorer som en förlängning till BMI1, men tappade igen i Zen -baserade processorer).

ABM (Advanced Bit Manipulation)

AMD var först med att introducera instruktionerna som nu bildar Intels BMI1 som en del av dess ABM- instruktionsuppsättning ( Advanced Bit Manipulation ), och lade sedan till stöd för Intels nya BMI2-instruktioner. AMD annonserar idag tillgången till dessa funktioner via Intels BMI1- och BMI2-cpuflaggor och instruerar programmerare att rikta in sig på dem.

Medan Intel betraktar POPCNT som en del av SSE4.2 och LZCNT som en del av BMI1, annonserar både Intel och AMD förekomsten av dessa två instruktioner individuellt. POPCNT har en separat CPUID- flagga med samma namn, och Intel och AMD använder AMD:s ABM- flagga för att indikera LZCNT -stöd (eftersom LZCNT kombinerat med BMI1 och BMI2 kompletterar den utökade ABM-instruktionsuppsättningen).

Kodning Instruktion Beskrivning
F3 0F B8 /r POPCNT Antal invånare
F3 0F BD /r LZCNT Inledande nollor räknas

LZCNT är relaterat till Bit Scan Reverse ( BSR )-instruktionen, men ställer in ZF (om resultatet är noll) och CF (om källan är noll) i stället för att ställa in ZF (om källan är noll). Dessutom ger den ett definierat resultat (källoperandstorleken i bitar) om källoperanden är noll. För ett argument som inte är noll är summan av LZCNT- och BSR- resultat argumentbitbredden minus 1 (till exempel om 32-bitars argument är 0x000f0000 ger LZCNT 12 och BSR ger 19).

Kodningen av LZCNT är sådan att om ABM inte stöds, så exekveras BSR- instruktionen istället.

BMI1 (Bit Manipulation Instruction Set 1)

Instruktionerna nedan är de som aktiveras av BMI -biten i CPUID. Intel betraktar officiellt LZCNT som en del av BMI, men annonserar LZCNT- stöd med ABM CPUID-funktionsflaggan. BMI1 finns i AMD:s Jaguar , Piledriver och nyare processorer, och i Intels Haswell och nyare processorer.

Kodning Instruktion Beskrivning Ekvivalent C-uttryck
VEX.LZ.0F38 F2 /r OCH N Logiskt och inte ~x & y
VEX.LZ.0F38 F7 /r BEXTR Bitfältsextrakt (med register) (källa >> start) & ((1 << len) - 1)
VEX.LZ.0F38 F3 /3 BLSI Extrahera den lägsta uppsättningen isolerade biten x & -x
VEX.LZ.0F38 F3 /2 BLSMSK Få masken upp till lägsta inställda bit x ^ (x - 1)
VEX.LZ.0F38 F3 /1 BLSR Återställ lägsta inställda bit x & (x - 1)
F3 0F BC /r TZCNT Räkna antalet efterföljande nollbitar
  
           0
           0
           0
           0
           0 31  +  (  !  x  )  -  (((  x  &  -  x  )  &  0x0000FFFF  )  ?  16  :  )  -  (((  x  &  -  x  )  &  0x00FF00FF  )  ?  8  :  )  -  (((  x  &  -  x  )  &  0x0F0F0F0F  )  ?  4  :  )  -  (((  x  &  -  x  )  &  0x33333333  )  ?  2  :  )  -  (((  x  &  -  x  )  &  0x55555555  )  ?  1  :  ) 

TZCNT är nästan identisk med instruktionen Bit Scan Forward ( BSF ), men ställer in ZF (om resultatet är noll) och CF (om källan är noll) i stället för att ställa in ZF (om källan är noll). För ett argument som inte är noll är resultatet av TZCNT och BSF lika.

Liksom med LZCNT är kodningen av TZCNT sådan att om BMI1 inte stöds, så exekveras BSF- instruktionen istället.

BMI2 (Bit Manipulation Instruction Set 2)

Intel introducerade BMI2 tillsammans med BMI1 i sin serie av Haswell-processorer. Endast AMD har producerat processorer som stöder BMI1 utan BMI2; BMI2 stöds av AMDs Excavator- arkitektur och nyare.

Kodning Instruktion Beskrivning
VEX.LZ.0F38 F5 /r BZHI Noll höga bitar som börjar med specificerad bitposition [src & (1 << inx)-1];
VEX.LZ.F2.0F38 F6 /r MULX Osignerad multiplicera utan att påverka flaggor och godtyckliga destinationsregister
VEX.LZ.F2.0F38 F5 /r PDEP Parallell bits insättning
VEX.LZ.F3.0F38 F5 /r PEXT Extrakt av parallella bitar
VEX.LZ.F2.0F3A F0 /r ib RORX Rotera höger logiskt utan att påverka flaggor
VEX.LZ.F3.0F38 F7 /r SARX Flytta aritmetisk höger utan att påverka flaggor
VEX.LZ.F2.0F38 F7 /r SHRX Skift logiskt åt höger utan att påverka flaggor
VEX.LZ.66.0F38 F7 /r SHLX Flytta logiskt åt vänster utan att påverka flaggor

Parallell bits deponering och extrakt

PDEP- och PEXT- instruktionerna är nya generaliserade instruktioner för komprimering och expandering bitnivå. De tar två ingångar; en är en källa och den andra är en väljare. Väljaren är en bitmapp som väljer de bitar som ska packas eller packas upp. PEXT kopierar valda bitar från källan till angränsande lågordningsbitar av destinationen; destinationsbitar av högre ordning rensas. PDEP gör motsatsen för de valda bitarna: sammanhängande bitar av låg ordning kopieras till utvalda bitar av destinationen; andra destinationsbitar rensas. Detta kan användas för att extrahera vilket bitfält som helst av inmatningen och till och med göra mycket blandning på bitnivå som tidigare skulle ha varit dyrt. Medan vad dessa instruktioner gör liknar bitnivå samla-scatter SIMD-instruktioner, fungerar PDEP- och PEXT- instruktioner (som resten av BMI-instruktionsuppsättningarna) på register för allmänna ändamål.

Instruktionerna finns i 32-bitars och 64-bitarsversioner. Ett exempel som använder godtycklig källa och väljare i 32-bitarsläge är:

Instruktion Väljarmask Källa Destination
PEXT 0xff00fff0 0x12345678 0x00012567
PDEP 0xff00fff0 0x00012567 0x12005670

AMD-processorer före Zen 3 som implementerar PDEP och PEXT gör det i mikrokod, med en latens på 18 cykler snarare än (Zen 3) 3 cykler. Som ett resultat är det ofta snabbare att använda andra instruktioner på dessa processorer.

TBM (Trailing Bit Manipulation)

TBM består av instruktioner som kompletterar den instruktionsuppsättning som startas av BMI1; deras komplementära karaktär innebär att de inte nödvändigtvis behöver användas direkt utan kan genereras av en optimerande kompilator när de stöds. AMD introducerade TBM tillsammans med BMI1 i sin Piledriver -linje av processorer; senare AMD Jaguar och Zen-baserade processorer stöder inte TBM. Inga Intel-processorer (åtminstone genom Alder Lake ) stöder TBM.

Kodning Instruktion Beskrivning Ekvivalent C-uttryck
XOP.LZ.0A 10 /r id BEXTR Bitfältsextrakt (med omedelbar) (källa >> start) & ((1 << len) - 1)
XOP.LZ.09 01 /1 BLCFILL Fyll från lägsta klara bit x & (x + 1)
XOP.LZ.09 02 /6 BLCI Isolera den lägsta klara biten x | ~(x + 1)
XOP.LZ.09 01 /5 BLCIC Isolera den lägsta klara biten och komplettera ~x & (x + 1)
XOP.LZ.09 02 /1 BLCMSK Mask från lägsta klara bit x ^ (x + 1)
XOP.LZ.09 01 /3 BLCS Ställ in lägsta klarbit x | (x + 1)
XOP.LZ.09 01 /2 BLSFILL Fyll från lägsta inställda bit x | (x - 1)
XOP.LZ.09 01 /6 BLSIC Isolera den lägsta inställda biten och komplettera ~x | (x - 1)
XOP.LZ.09 01 /7 T1MSKC Omvänd mask från efterföljande ~x | (x + 1)
XOP.LZ.09 01 /4 TZMSK Mask från efterföljande nollor ~x & (x - 1)

Stödjer processorer

Observera att stöd för instruktionsförlängning betyder att processorn kan utföra de instruktioner som stöds för programvarukompatibilitet. Processorn kanske inte fungerar så bra. Till exempel implementerar Excavator till Zen 2-processorer PEXT- och PDEP-instruktioner med hjälp av mikrokod, vilket resulterar i att instruktionerna körs betydligt långsammare än samma beteende som återskapats med andra instruktioner. (En mjukvarumetod som kallas "zp7" är faktiskt snabbare på dessa maskiner.) För optimal prestanda rekommenderas att kompilatorutvecklare väljer att använda individuella instruktioner i tilläggen baserat på arkitekturspecifika prestandaprofiler snarare än på tilläggstillgänglighet.

Se även

Vidare läsning

externa länkar