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
А если мы хотим поменять его значение, то
	btog	2,%r5
		
		xor	%r5,4,%r5
В случае если бит один из старших и мы не можем до него добраться через immediate, мы берем еще один регистр и формируем там маску. Затем выполняется все тоже самое.


Bit Test



	CF = BIT[Source, Number]
----------------------------------------------------------------------------- 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

	BIT[Source, Number] = 1


----------------------------------------------------------------------------- o Bit Set X86 BTS 16,32 RR RI ----------------------------------------- Z80 SET 8 _I_R ----------------------------------------- 68K BSET 8,32 RR RI


Bit Reset

	BIT[Source, Number] = 0


----------------------------------------------------------------------------- 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