cpu.x86.assembler: add MOVABS instruction

MOVABS generates the one-byte opcode version of MOV eAX, [absolute] or MOV [absolute], eAX, which saves a byte per safepoint on x86-32.
db4
Joe Groff 2011-10-17 17:11:12 -07:00
parent 9b575730bb
commit ae1a903c4e
3 changed files with 70 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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