]> gitweb.factorcode.org Git - factor.git/commitdiff
cpu.x86.*: faster versions of the X-bit-version-of words
authorBjörn Lindqvist <bjourne@gmail.com>
Wed, 25 May 2016 17:07:33 +0000 (19:07 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Wed, 25 May 2016 17:21:55 +0000 (19:21 +0200)
It should make the %load-immediate word a bit faster.

basis/cpu/x86/assembler/operands/operands.factor
basis/cpu/x86/x86.factor

index ecdc00247529782b8c05c46ecd8442389253f768..f40d84bb94cdee5b8e28115c89517a977e9038e5 100644 (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
index 5462587280ced48b4a913168741c79c0afb932f9..7b5e52db5217a4a66dcdf1d637ac5acc8a95cef1 100644 (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 ]