diff --git a/basis/cpu/x86/32/bootstrap.factor b/basis/cpu/x86/32/bootstrap.factor index 2943bf9c48..184c0e6b33 100755 --- a/basis/cpu/x86/32/bootstrap.factor +++ b/basis/cpu/x86/32/bootstrap.factor @@ -360,7 +360,7 @@ IN: bootstrap.x86 jit-jump-quot ; : jit-safepoint ( -- ) - 0 [] EAX MOV rc-absolute rel-safepoint ; + 0 EAX MOVABS rc-absolute rel-safepoint ; [ jit-start-context-and-delete diff --git a/basis/cpu/x86/assembler/assembler-tests.factor b/basis/cpu/x86/assembler/assembler-tests.factor index f0309c2e58..eee964197a 100644 --- a/basis/cpu/x86/assembler/assembler-tests.factor +++ b/basis/cpu/x86/assembler/assembler-tests.factor @@ -235,9 +235,57 @@ cell 4 = [ bootstrap-cell 4 = [ [ { 100 199 5 0 0 0 0 123 0 0 0 } ] [ [ 0 [] FS 123 MOV ] { } make ] unit-test + + [ { HEX: a0 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ AL HEX: 0123,4567 MOVABS ] { } make ] unit-test + + [ { HEX: 66 HEX: a1 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ AX HEX: 0123,4567 MOVABS ] { } make ] unit-test + + [ { HEX: a1 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ EAX HEX: 0123,4567 MOVABS ] { } make ] unit-test + + [ { HEX: 48 HEX: a1 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ RAX HEX: 0123,4567 MOVABS ] { } make ] unit-test + + [ { HEX: a2 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567 AL MOVABS ] { } make ] unit-test + + [ { HEX: 66 HEX: a3 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567 AX MOVABS ] { } make ] unit-test + + [ { HEX: a3 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567 EAX MOVABS ] { } make ] unit-test + + [ { HEX: 48 HEX: a3 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567 RAX MOVABS ] { } make ] unit-test ] when bootstrap-cell 8 = [ [ { 72 137 13 123 0 0 0 } ] [ [ 123 [RIP+] RCX MOV ] { } make ] unit-test [ { 101 72 137 12 37 123 0 0 0 } ] [ [ 123 [] GS RCX MOV ] { } make ] unit-test + + [ { HEX: a0 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ AL HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test + + [ { HEX: 66 HEX: a1 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ AX HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test + + [ { HEX: a1 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ EAX HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test + + [ { HEX: 48 HEX: a1 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ RAX HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test + + [ { HEX: a2 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567,89ab,cdef AL MOVABS ] { } make ] unit-test + + [ { HEX: 66 HEX: a3 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567,89ab,cdef AX MOVABS ] { } make ] unit-test + + [ { HEX: a3 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567,89ab,cdef EAX MOVABS ] { } make ] unit-test + + [ { HEX: 48 HEX: a3 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ] + [ [ HEX: 0123,4567,89ab,cdef RAX MOVABS ] { } make ] unit-test ] when diff --git a/basis/cpu/x86/assembler/assembler.factor b/basis/cpu/x86/assembler/assembler.factor index 35613ac163..dc04271db1 100644 --- a/basis/cpu/x86/assembler/assembler.factor +++ b/basis/cpu/x86/assembler/assembler.factor @@ -231,6 +231,27 @@ GENERIC: MOV ( dst src -- ) M: immediate MOV (MOV-I) ; M: operand MOV HEX: 88 2-operand ; +ERROR: bad-movabs-operands dst src ; + +GENERIC: MOVABS ( dst src -- ) +M: object MOVABS bad-movabs-operands ; +M: register MOVABS + { + { AL [ HEX: a2 , cell, ] } + { AX [ HEX: 66 , HEX: a3 , cell, ] } + { EAX [ HEX: a3 , cell, ] } + { RAX [ HEX: 48 , HEX: a3 , cell, ] } + [ swap bad-movabs-operands ] + } case ; +M: integer MOVABS + swap { + { AL [ HEX: a0 , cell, ] } + { AX [ HEX: 66 , HEX: a1 , cell, ] } + { EAX [ HEX: a1 , cell, ] } + { RAX [ HEX: 48 , HEX: a1 , cell, ] } + [ swap bad-movabs-operands ] + } case ; + : LEA ( dst src -- ) swap HEX: 8d 2-operand ; ! Control flow