cpu.x86: use full set of 8-bit, 16-bit and 32-bit registers on x86-64 to avoid clumsy save/restore logic

db4
Slava Pestov 2009-07-29 21:56:37 -05:00
parent 73862a9a03
commit 8ca17d053c
2 changed files with 7 additions and 15 deletions

View File

@ -1,6 +1,7 @@
! Copyright (C) 2008, 2009 Slava Pestov, Joe Groff.
! 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 32-bit mode, { 1234 } is absolute indirect addressing.
@ -101,16 +102,12 @@ TUPLE: byte value ;
C: <byte> byte
<PRIVATE
: n-bit-version-of ( register n -- register' )
! Certain 8-bit registers don't exist in 32-bit mode...
[ "register" word-prop ] dip registers get at nth
dup { SPL BPL SIL DIL } memq? cell 4 = and
[ drop f ] when ;
PRIVATE>
: 8-bit-version-of ( register -- register' ) 8 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 ;

View File

@ -264,18 +264,13 @@ M:: x86 %box-alien ( dst src temp -- )
"end" resolve-label
] with-scope ;
HOOK: small-regs cpu ( -- regs )
HOOK: small-reg? cpu ( reg -- regs )
M: x86.32 small-regs { EAX ECX EDX EBX } ;
M: x86.64 small-regs { RAX RCX RDX RBX } ;
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 ;
M: x86.32 small-reg? { EAX ECX EDX EBX } memq? ;
M: x86.64 small-reg? drop t ;
: 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 -- )
[ 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
#! register that is not in exclude, and call quot, saving
#! and restoring the small register.
dst small-regs memq? [ dst quot call ] [
dst small-reg? [ dst quot call ] [
exclude small-reg-that-isn't
[ quot call ] with-save/restore
] if ; inline