cpu.x86.*: faster versions of the X-bit-version-of words

It should make the %load-immediate word a bit faster.
locals-and-roots
Björn Lindqvist 2016-05-25 19:07:33 +02:00
parent 5733d98236
commit 97c10cc0f1
2 changed files with 34 additions and 8 deletions

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008, 2010 Slava Pestov, Joe Groff.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel words math accessors sequences namespaces
assocs layouts cpu.x86.assembler.syntax ;
USING: accessors arrays assocs cpu.x86.assembler.syntax hashtables
kernel kernel.private layouts math namespaces sequences words ;
IN: cpu.x86.assembler.operands
REGISTERS: 8 AL CL DL BL SPL BPL SIL DIL R8B R9B R10B R11B R12B R13B R14B R15B ;
@ -130,8 +130,32 @@ C: <byte> byte
dup extended-8-bit-register? cell 4 = and
[ drop f ] when ;
: 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 ;
: 64-bit-version-of ( register -- register' ) 64 n-bit-version-of ;
: native-version-of ( register -- register' ) cell-bits n-bit-version-of ;
: cached-n-bit-version-of ( register n -- register' )
swap { word } declare props>> { hashtable } declare at ; inline
: 8-bit-version-of ( register -- register' )
8 cached-n-bit-version-of ; inline
: 16-bit-version-of ( register -- register' )
16 cached-n-bit-version-of ; inline
: 32-bit-version-of ( register -- register' )
32 cached-n-bit-version-of ; inline
: 64-bit-version-of ( register -- register' )
64 cached-n-bit-version-of ; inline
: native-version-of ( register -- register' )
cell-bits cached-n-bit-version-of ; inline
! copy paste
: set-extra-props ( word extra-props -- )
[ rot set-word-prop ] with assoc-each ;
! All the bit size register mapping are precalculated to make code
! generation a little faster.
: precalc-register-versions ( reg -- )
dup { 8 16 32 64 } [
dup swapd n-bit-version-of 2array
] with map set-extra-props ;
: precalc-all-register-versions ( -- )
registers get values concat [ precalc-register-versions ] each ;
precalc-all-register-versions

View File

@ -11,6 +11,7 @@ cpu.x86.assembler.operands cpu.x86.assembler.private cpu.x86.features
cpu.x86.features.private fry io kernel layouts locals make math
math.order memory namespaces sequences system vm vocabs ;
QUALIFIED-WITH: alien.c-types c
FROM: kernel.private => declare ;
FROM: math => float ;
IN: cpu.x86
@ -61,7 +62,8 @@ M: x86 test-instruction? t ;
M: x86 immediate-store? immediate-comparand? ;
M: x86 %load-immediate [ 32-bit-version-of dup XOR ] [ MOV ] if-zero ;
M: x86 %load-immediate ( reg val -- )
{ fixnum } declare [ 32-bit-version-of dup XOR ] [ MOV ] if-zero ;
M: x86 %load-reference
[ swap 0 MOV rc-absolute-cell rel-literal ]