From 986ed057d83cf2589e76410c421c72a1a95580fb Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 15 May 2010 13:08:22 -0700 Subject: [PATCH] cpu.x86.assembler: BT family instructions --- .../cpu/x86/assembler/assembler-tests.factor | 15 +++++++++++++ basis/cpu/x86/assembler/assembler.factor | 21 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/basis/cpu/x86/assembler/assembler-tests.factor b/basis/cpu/x86/assembler/assembler-tests.factor index 2959910f0e..00a3b32867 100644 --- a/basis/cpu/x86/assembler/assembler-tests.factor +++ b/basis/cpu/x86/assembler/assembler-tests.factor @@ -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 = [ diff --git a/basis/cpu/x86/assembler/assembler.factor b/basis/cpu/x86/assembler/assembler.factor index 76157bd7cc..1699eb0d65 100644 --- a/basis/cpu/x86/assembler/assembler.factor +++ b/basis/cpu/x86/assembler/assembler.factor @@ -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 ;