diff --git a/basis/cpu/x86/assembler/assembler-docs.factor b/basis/cpu/x86/assembler/assembler-docs.factor index 8a6228655d..0dae1baee8 100644 --- a/basis/cpu/x86/assembler/assembler-docs.factor +++ b/basis/cpu/x86/assembler/assembler-docs.factor @@ -1,5 +1,5 @@ USING: compiler.codegen.labels cpu.x86.assembler.private help.markup -help.syntax sequences ; +help.syntax kernel math sequences ; IN: cpu.x86.assembler HELP: 1-operand @@ -30,9 +30,17 @@ HELP: MOV { $description "Moves a value from one place to another." } ; HELP: (MOV-I) -{ $values { "dst" "destination" "src" "immediate value" } } -{ $description "MOV where the src is immediate." } ; +{ $values { "dst" "destination" } { "src" "immediate value" } } +{ $description "MOV where 'src' is immediate. If dst is a 64-bit register and the 'src' value fits in 32 bits, then zero extension is taken advantage of by downgrading 'dst' to a 32-bit register. That way, the instruction gets a shorter encoding." } ; -ARTICLE: "cpu.x86.assembler" "X86 assembler" "This vocab implements an assembler for x86 architectures." ; +HELP: zero-extendable? +{ $values { "imm" integer } { "?" boolean } } +{ $description "All positive 32-bit numbers are zero extendable except for 0 which is the value used for relocations." } ; + +ARTICLE: "cpu.x86.assembler" "X86 assembler" +"This vocab implements an assembler for x86 architectures." +$nl +"Instructions:" +{ $subsections MOV } ; ABOUT: "cpu.x86.assembler" diff --git a/basis/cpu/x86/assembler/assembler-tests.factor b/basis/cpu/x86/assembler/assembler-tests.factor index 745feec4c5..64a749684c 100644 --- a/basis/cpu/x86/assembler/assembler-tests.factor +++ b/basis/cpu/x86/assembler/assembler-tests.factor @@ -12,11 +12,8 @@ IN: cpu.x86.assembler.tests { { 136 235 } } [ [ BL CH MOV ] { } make ] unit-test ! immediate operands -cell 4 = [ - [ { 0xb9 0x01 0x00 0x00 0x00 } ] [ [ ECX 1 MOV ] { } make ] unit-test -] [ - [ { 0xb9 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 } ] [ [ ECX 1 MOV ] { } make ] unit-test -] if +[ { 0xb9 0x01 0x00 0x00 0x00 } ] [ [ ECX 1 MOV ] { } make ] unit-test +[ { 0xb9 0x01 0x00 0x00 0x00 } ] [ [ RCX 1 MOV ] { } make ] unit-test { { 0x83 0xc1 0x01 } } [ [ ECX 1 ADD ] { } make ] unit-test { { 0x81 0xc1 0x96 0x00 0x00 0x00 } } [ [ ECX 150 ADD ] { } make ] unit-test diff --git a/basis/cpu/x86/assembler/assembler.factor b/basis/cpu/x86/assembler/assembler.factor index 68f8707176..3d72112e19 100644 --- a/basis/cpu/x86/assembler/assembler.factor +++ b/basis/cpu/x86/assembler/assembler.factor @@ -212,13 +212,23 @@ M: operand POP { 0b000 f 0x8f } 1-operand ;