]> gitweb.factorcode.org Git - factor.git/commitdiff
cpu.x86.assembler: zero-extension can work on the TEST instruction too
authorBjörn Lindqvist <bjourne@gmail.com>
Tue, 24 May 2016 12:37:20 +0000 (14:37 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Tue, 24 May 2016 12:37:20 +0000 (14:37 +0200)
basis/cpu/x86/assembler/assembler-tests.factor
basis/cpu/x86/assembler/assembler.factor

index 64a749684c49ee64df9880233b14bc21ff85f493..3f27b9bdfd61bbcd61517062511379a660220bfa 100644 (file)
@@ -17,7 +17,9 @@ IN: cpu.x86.assembler.tests
 
 { { 0x83 0xc1 0x01 } } [ [ ECX 1 ADD ] { } make ] unit-test
 { { 0x81 0xc1 0x96 0x00 0x00 0x00 } } [ [ ECX 150 ADD ] { } make ] unit-test
+
 { { 0xf7 0xc1 0xd2 0x04 0x00 0x00 } } [ [ ECX 1234 TEST ] { } make ] unit-test
+{ { 0xf7 0xc3 0x0f 0x00 0x00 0x00 } } [ [ RBX 0xf TEST ] { } make ] unit-test
 
 ! 64-bit registers
 { { 0x40 0x8a 0x2a } } [ [ BPL RDX [] MOV ] { } make ] unit-test
index 87e9bdd0a361e0bb211c8db74e7d6b155858559e..84ff473567d88ff2cb2028072dcb8398efb8da93 100644 (file)
@@ -211,6 +211,9 @@ M: operand POP { 0b000 f 0x8f } 1-operand ;
 : zero-extendable? ( imm -- ? )
     1 32 2^ 1 - between? ;
 
+: maybe-zero-extend ( reg imm -- reg' imm )
+    dup zero-extendable? [ [ 32-bit-version-of ] dip ] when ;
+
 GENERIC# (MOV-I) 1 ( dst src -- )
 
 M: register (MOV-I)
@@ -336,8 +339,7 @@ M: operand SBB 0o030 2-operand ;
 
 GENERIC: AND ( dst src -- )
 M: immediate AND ( dst src -- )
-    dup zero-extendable? [ [ 32-bit-version-of ] dip ] when
-    { 0b100 t 0x80 } immediate-1/4 ;
+    maybe-zero-extend { 0b100 t 0x80 } immediate-1/4 ;
 M: operand AND 0o040 2-operand ;
 
 GENERIC: SUB ( dst src -- )
@@ -360,7 +362,8 @@ M: immediate CMP ( dst src -- )
 M: operand CMP 0o070 2-operand ;
 
 GENERIC: TEST ( dst src -- )
-M: immediate TEST { 0b0 t 0xf7 } immediate-4 ;
+M: immediate TEST ( dst src -- )
+    maybe-zero-extend { 0b0 t 0xf7 } immediate-4 ;
 M: operand TEST 0o204 2-operand ;
 
 : XCHG ( dst src -- ) 0o207 2-operand ;