cpu.x86.assembler: BT family instructions
							parent
							
								
									010b5069bd
								
							
						
					
					
						commit
						986ed057d8
					
				| 
						 | 
				
			
			@ -190,6 +190,21 @@ cell 4 = [
 | 
			
		|||
[ { HEX: 48 HEX: 6b HEX: c1 HEX: 03 } ] [ [ RAX RCX 3 IMUL3 ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 48 HEX: 69 HEX: c1 HEX: 44 HEX: 03 HEX: 00 HEX: 00 } ] [ [ RAX RCX HEX: 344 IMUL3 ] { } make ] unit-test
 | 
			
		||||
 | 
			
		||||
! BT family instructions
 | 
			
		||||
[ { HEX: 0f HEX: ba HEX: e0 HEX: 01 } ] [ [ EAX 1 BT ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: ba HEX: f8 HEX: 01 } ] [ [ EAX 1 BTC ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: ba HEX: e8 HEX: 01 } ] [ [ EAX 1 BTS ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: ba HEX: f0 HEX: 01 } ] [ [ EAX 1 BTR ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 48 HEX: 0f HEX: ba HEX: e0 HEX: 01 } ] [ [ RAX 1 BT ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: ba HEX: 20 HEX: 01 } ] [ [ EAX [] 1 BT ] { } make ] unit-test
 | 
			
		||||
 | 
			
		||||
[ { HEX: 0f HEX: a3 HEX: d8 } ] [ [ EAX EBX BT ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: bb HEX: d8 } ] [ [ EAX EBX BTC ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: ab HEX: d8 } ] [ [ EAX EBX BTS ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: b3 HEX: d8 } ] [ [ EAX EBX BTR ] { } make ] unit-test
 | 
			
		||||
[ { HEX: 0f HEX: a3 HEX: 18 } ] [ [ EAX [] EBX BT ] { } make ] unit-test
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[ { 15 183 195 } ] [ [ EAX BX MOVZX ] { } make ] unit-test
 | 
			
		||||
 | 
			
		||||
bootstrap-cell 4 = [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -152,8 +152,11 @@ M: register displacement, drop ;
 | 
			
		|||
: immediate-operand-size-bit ( dst imm reg,rex.w,opcode -- imm dst reg,rex.w,opcode )
 | 
			
		||||
    over integer? [ first3 BIN: 1 opcode-or 3array ] when ;
 | 
			
		||||
 | 
			
		||||
: immediate-1* ( dst imm reg,rex.w,opcode -- )
 | 
			
		||||
    swap [ 1-operand ] dip 1, ;
 | 
			
		||||
 | 
			
		||||
: immediate-1 ( dst imm reg,rex.w,opcode -- )
 | 
			
		||||
    immediate-operand-size-bit swap [ 1-operand ] dip 1, ;
 | 
			
		||||
    immediate-operand-size-bit immediate-1* ;
 | 
			
		||||
 | 
			
		||||
: immediate-4 ( dst imm reg,rex.w,opcode -- )
 | 
			
		||||
    immediate-operand-size-bit swap [ 1-operand ] dip 4, ;
 | 
			
		||||
| 
						 | 
				
			
			@ -304,6 +307,22 @@ M: operand TEST OCT: 204 2-operand ;
 | 
			
		|||
 | 
			
		||||
: BSR ( dst src -- ) { HEX: 0f HEX: bd } (2-operand) ;
 | 
			
		||||
 | 
			
		||||
GENERIC: BT ( value n -- )
 | 
			
		||||
M: immediate BT ( value n -- ) { BIN: 100 t { HEX: 0f HEX: ba } } immediate-1* ;
 | 
			
		||||
M: operand   BT ( value n -- ) swap { HEX: 0f HEX: a3 } (2-operand) ;
 | 
			
		||||
 | 
			
		||||
GENERIC: BTC ( value n -- )
 | 
			
		||||
M: immediate BTC ( value n -- ) { BIN: 111 t { HEX: 0f HEX: ba } } immediate-1* ;
 | 
			
		||||
M: operand   BTC ( value n -- ) swap { HEX: 0f HEX: bb } (2-operand) ;
 | 
			
		||||
 | 
			
		||||
GENERIC: BTR ( value n -- )
 | 
			
		||||
M: immediate BTR ( value n -- ) { BIN: 110 t { HEX: 0f HEX: ba } } immediate-1* ;
 | 
			
		||||
M: operand   BTR ( value n -- ) swap { HEX: 0f HEX: b3 } (2-operand) ;
 | 
			
		||||
 | 
			
		||||
GENERIC: BTS ( value n -- )
 | 
			
		||||
M: immediate BTS ( value n -- ) { BIN: 101 t { HEX: 0f HEX: ba } } immediate-1* ;
 | 
			
		||||
M: operand   BTS ( value n -- ) swap { HEX: 0f HEX: ab } (2-operand) ;
 | 
			
		||||
 | 
			
		||||
: NOT  ( dst -- ) { BIN: 010 t HEX: f7 } 1-operand ;
 | 
			
		||||
: NEG  ( dst -- ) { BIN: 011 t HEX: f7 } 1-operand ;
 | 
			
		||||
: MUL  ( dst -- ) { BIN: 100 t HEX: f7 } 1-operand ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue