! 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.
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 ;
"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
#! 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