35.2.1.9. ОПЕРАЦИИ С БИТАМИ И БИТОВЫМИ СТРОКАМИ
(Need to Update This sections)
Insert Bitstring
PPC:
IA-64:
dep r1 = r2,r3,pos{6},len{4}
x86:
С помощью команд SHLD, SHRD
-----------------------------------------------------------------------------
o Insert (Deposite) Data into Bitstring
IA-64 DEP 64 R1=R2,R3,pos(6),len(4)
64 R1=I1,R3,pos(6),len(4)
DEP.Z 64 R1=R2,pos(6),len(4) Zero form
64 R1=I8,pos(6),len(6)
----- ----- ----- ------
MIX1.1 64 R1=R2,R3 Mix Integer Bytes
MIX2.1 64 R1=R2,R3
MIX4.1 64 R1=R2,R3
----- ----- ----- ----
MUX1 64 R1=R2,mbtype(4) One byte form
MUX2 64 R1=R2,mhtype(8) two byte form
----------------------------------------
x86 (*) Use SHLD, SHRD for deposite strings
----------------------------------------
68K BFINS 32 R,M,pos,len
Extract Bitstring
IA-64:
extr
extr.u
-----------------------------------------------------------------------------
o Extract Data from Bitstring
IA-64 EXTR 64 R1=R2,pos(6),len(6) (Signed)
RXTR.U 64 R1=R2,pos(6),len(6) (Unsigned)
-----------------------------------------
x86 (*) Use SHLD, SHRD for deposite strings
-----------------------------------------
68K BFEXTRS 32 R,pos,len,M
BFEXTRU 32 R,pos,len,M
Bit Test/Set/Clear
Для архитектур которые не поддерживают эти команды, можно добиться схожего
эффекта используя логические операции с битовыми масками.
Особенно это эффективно для малых номеров битов, потому что на RISC процессорах
как правило есть форма логических комманд с immediate (как правило порядка 10-13 бит),
который знаково расширяется.
Поэтому например если мы хотим на SPARC узнать значение скажем бита 2 в R5:
то
btst 2,%r5
andcc %r5,4,%g0 ! в ZF мы получим инверсию этого бита
|
Или если мы хотим узнать его значение, а потом установить то:
! сначало тестируем
andcc %r5,4,%g0 ! ставить ZF
bset 2,%r5 ! псевдооперация
! означает:
or %r5,4,%r5 ! не трогает флаги
|
Если мы хотим его сбросить
bclr 2,%r5
andn %r5,4,%r5
|
А если мы хотим поменять его значение, то
В случае если бит один из старших и мы не можем до него добраться через
immediate, мы берем еще один регистр и формируем там маску.
Затем выполняется все тоже самое.
Bit Test
-----------------------------------------------------------------------------
o Bit Test
X86 BT 16,32 RR CF <- Bit
RI
-----------------------------------------
Z80 BIT 8 _I_R
-----------------------------------------
68K BTST 8,32 RR
RI
-----------------------------------------
IA64 TBITxx 64 PPRI
Bit Set
-----------------------------------------------------------------------------
o Bit Set
X86 BTS 16,32 RR
RI
-----------------------------------------
Z80 SET 8 _I_R
-----------------------------------------
68K BSET 8,32 RR
RI
Bit Reset
-----------------------------------------------------------------------------
o Bit Reset
X86 BTR 16,32 RR
RI
-----------------------------------------
Z80 RES 8 _I_R
-----------------------------------------
68K BCLR 8,32 RR
RI
Bit Complement
BIT[Source, Number] = - BIT[Source, Number]
|
-----------------------------------------------------------------------------
o Bit Complement
X86 BTC 16,32 RR
RI
-----------------------------------------
68K BCHG 8,32 RR
RI
-------------------------------------------------------------------------
Population Count
Destionation = Number_of_1s_Bits(Source)
|
PowerPC:
Существует инструкция POPCNTB которая вычисляет population count
в каждом байте.
Для вычисления population count в двойном слове:
popcntb RT,RA
mulld RT,RT,RB # RB = 0x0101010101010101
srdi RT,RT,56 # now RT = popilation count
Для SPARC - c помощью population count - можно реализовать number of trailing zeroes
int ffs(unsigned zz) { return popc(zz ^ (~ (-zz))) }
neg %IN, %M_IN
xnor %IN, %M_IN, %TEMP
popc %TEMP, %RESULT
movrz %IN, %g0, %RESULT ! Result must be 0 if %IN ==
---------------------------------------------------------------------------
o Population count
x86 POPCNT 16 RR RM SSE 4.2
32 RR RM
------------------------------------
Alpha CTPOP
------------------------------------
PPC POPCNTB '*' RR
(*) Complex Sequence
------------------------------------
MIPS
------------------------------------
SPARC POPC max RR RI
------------------------------------
HPPA
------------------------------------
68K
------------------------------------
VAX-11
------------------------------------
ARM
------------------------------------
IA-64 POPCNT max RR
------------------------------------
SH4
Count of Leading Zeroes
Destinaton = Position_of_First_Leftmost_Bit_which_is_1(Source)
|
VAX-11:
FFC off,len,addr,long Find first clear bit
FFS off,len,addr,long Find first set bit
IA-64
czx1.l r1=r2 Compute Index of first Zero Element (Byte,word) Left
czx1.r r1=r2 Right
---------------------------------------------------------------------------
o Count Number of Leading Zeroes
x86 BSR 16 RR RM
32 RR RM
------------------------------------
Alpha CTLZ
------------------------------------
PPC CNTLZW max RR
CNTLZW. max RR
------------------------------------
MIPS
------------------------------------
SPARC
------------------------------------
HPPA
------------------------------------
68K BFFO 32 RRII RRII позволяет искать биты в битовом поле
68020+
------------------------------------
VAX-11
------------------------------------
ARM
------------------------------------
IA-64
------------------------------------
SH4
Count of Trailing Zeroes
Destinaton = Position_of_First_Rightmost_Bit_which_is_1(Source)
|
---------------------------------------------------------------------------
o Count Number of Trailing Zeroes
x86 BSF 16 RR RM
32 RR RM
------------------------------------
Alpha CTTZ
------------------------------------
PPC CNTLZD max RR
------------------------------------
MIPS
------------------------------------
SPARC
------------------------------------
HPPA
------------------------------------
68K
------------------------------------
VAX-11
------------------------------------
ARM
------------------------------------
IA-64
------------------------------------
SH4
Index Prev Next