diff --git a/basis/cpu/x86/assembler/assembler-tests.factor b/basis/cpu/x86/assembler/assembler-tests.factor index 64a749684c..3f27b9bdfd 100644 --- a/basis/cpu/x86/assembler/assembler-tests.factor +++ b/basis/cpu/x86/assembler/assembler-tests.factor @@ -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 diff --git a/basis/cpu/x86/assembler/assembler.factor b/basis/cpu/x86/assembler/assembler.factor index 87e9bdd0a3..84ff473567 100644 --- a/basis/cpu/x86/assembler/assembler.factor +++ b/basis/cpu/x86/assembler/assembler.factor @@ -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 ;