cpu.x86: use full set of 8-bit, 16-bit and 32-bit registers on x86-64 to avoid clumsy save/restore logic
parent
73862a9a03
commit
8ca17d053c
|
@ -1,6 +1,7 @@
|
||||||
! Copyright (C) 2008, 2009 Slava Pestov, Joe Groff.
|
! Copyright (C) 2008, 2009 Slava Pestov, Joe Groff.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel words math accessors sequences cpu.x86.assembler.syntax ;
|
USING: kernel words math accessors sequences namespaces
|
||||||
|
assocs layouts cpu.x86.assembler.syntax ;
|
||||||
IN: cpu.x86.assembler.operands
|
IN: cpu.x86.assembler.operands
|
||||||
|
|
||||||
! In 32-bit mode, { 1234 } is absolute indirect addressing.
|
! In 32-bit mode, { 1234 } is absolute indirect addressing.
|
||||||
|
@ -101,16 +102,12 @@ TUPLE: byte value ;
|
||||||
|
|
||||||
C: <byte> byte
|
C: <byte> byte
|
||||||
|
|
||||||
<PRIVATE
|
|
||||||
|
|
||||||
: n-bit-version-of ( register n -- register' )
|
: n-bit-version-of ( register n -- register' )
|
||||||
! Certain 8-bit registers don't exist in 32-bit mode...
|
! Certain 8-bit registers don't exist in 32-bit mode...
|
||||||
[ "register" word-prop ] dip registers get at nth
|
[ "register" word-prop ] dip registers get at nth
|
||||||
dup { SPL BPL SIL DIL } memq? cell 4 = and
|
dup { SPL BPL SIL DIL } memq? cell 4 = and
|
||||||
[ drop f ] when ;
|
[ drop f ] when ;
|
||||||
|
|
||||||
PRIVATE>
|
|
||||||
|
|
||||||
: 8-bit-version-of ( register -- register' ) 8 n-bit-version-of ;
|
: 8-bit-version-of ( register -- register' ) 8 n-bit-version-of ;
|
||||||
: 16-bit-version-of ( register -- register' ) 16 n-bit-version-of ;
|
: 16-bit-version-of ( register -- register' ) 16 n-bit-version-of ;
|
||||||
: 32-bit-version-of ( register -- register' ) 32 n-bit-version-of ;
|
: 32-bit-version-of ( register -- register' ) 32 n-bit-version-of ;
|
||||||
|
|
|
@ -264,18 +264,13 @@ M:: x86 %box-alien ( dst src temp -- )
|
||||||
"end" resolve-label
|
"end" resolve-label
|
||||||
] with-scope ;
|
] with-scope ;
|
||||||
|
|
||||||
HOOK: small-regs cpu ( -- regs )
|
HOOK: small-reg? cpu ( reg -- regs )
|
||||||
|
|
||||||
M: x86.32 small-regs { EAX ECX EDX EBX } ;
|
M: x86.32 small-reg? { EAX ECX EDX EBX } memq? ;
|
||||||
M: x86.64 small-regs { RAX RCX RDX RBX } ;
|
M: x86.64 small-reg? drop t ;
|
||||||
|
|
||||||
HOOK: small-reg-native cpu ( reg -- reg' )
|
|
||||||
|
|
||||||
M: x86.32 small-reg-native small-reg-4 ;
|
|
||||||
M: x86.64 small-reg-native small-reg-8 ;
|
|
||||||
|
|
||||||
: small-reg-that-isn't ( exclude -- reg' )
|
: small-reg-that-isn't ( exclude -- reg' )
|
||||||
small-regs swap [ native-version-of ] map '[ _ memq? not ] find nip ;
|
[ native-version-of ] map [ small-reg? not ] find nip ;
|
||||||
|
|
||||||
: with-save/restore ( reg quot -- )
|
: with-save/restore ( reg quot -- )
|
||||||
[ drop PUSH ] [ call ] [ drop POP ] 2tri ; inline
|
[ drop PUSH ] [ call ] [ drop POP ] 2tri ; inline
|
||||||
|
@ -285,7 +280,7 @@ M: x86.64 small-reg-native small-reg-8 ;
|
||||||
#! call the quot with that. Otherwise, we find a small
|
#! call the quot with that. Otherwise, we find a small
|
||||||
#! register that is not in exclude, and call quot, saving
|
#! register that is not in exclude, and call quot, saving
|
||||||
#! and restoring the small register.
|
#! and restoring the small register.
|
||||||
dst small-regs memq? [ dst quot call ] [
|
dst small-reg? [ dst quot call ] [
|
||||||
exclude small-reg-that-isn't
|
exclude small-reg-that-isn't
|
||||||
[ quot call ] with-save/restore
|
[ quot call ] with-save/restore
|
||||||
] if ; inline
|
] if ; inline
|
||||||
|
|
Loading…
Reference in New Issue