{ { 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
: 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)
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 -- )
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 ;