From 9cf36e3dc23552489067bd0e09d2e075b22ec37a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Mon, 10 Aug 2015 14:40:56 +0200 Subject: [PATCH] bootstrap.image: attempt to remove the SPECIAL-OBJECT: table Instead of using newly defined words as keys to the special-objects hash being built, you can reuse the constants in kernel.private --- basis/bootstrap/assembler/x86.64.factor | 11 ++- basis/bootstrap/assembler/x86.factor | 34 +++---- basis/bootstrap/image/image-docs.factor | 3 - basis/bootstrap/image/image.factor | 126 +++++++----------------- core/bootstrap/stage1.factor | 3 +- 5 files changed, 62 insertions(+), 115 deletions(-) diff --git a/basis/bootstrap/assembler/x86.64.factor b/basis/bootstrap/assembler/x86.64.factor index 9174cd6f42..1cf3ee2a78 100644 --- a/basis/bootstrap/assembler/x86.64.factor +++ b/basis/bootstrap/assembler/x86.64.factor @@ -44,7 +44,7 @@ IN: bootstrap.x86 [ pic-tail-reg 5 [RIP+] LEA 0 JMP f rc-relative rel-word-pic-tail -] jit-word-jump jit-define +] JIT-WORD-JUMP jit-define : jit-load-vm ( -- ) ! no-op on x86-64. in factor contexts vm-reg always contains the @@ -56,6 +56,9 @@ IN: bootstrap.x86 : jit-save-context ( -- ) jit-load-context + ! The reason for -8 I think is because we are anticipating a CALL + ! instruction. After the call instruction, the contexts frame_top + ! will point to the origin jump address. R11 RSP -8 [+] LEA ctx-reg context-callstack-top-offset [+] R11 MOV ctx-reg context-datastack-offset [+] ds-reg MOV @@ -75,7 +78,7 @@ IN: bootstrap.x86 RAX 0 MOV f f rc-absolute-cell rel-dlsym RAX CALL jit-restore-context -] jit-primitive jit-define +] JIT-PRIMITIVE jit-define : jit-jump-quot ( -- ) arg1 quot-entry-point-offset [+] JMP ; @@ -177,7 +180,7 @@ IN: bootstrap.x86 [ temp2 0xffffffff MOV f rc-absolute-cell rel-literal temp1 temp2 CMP -] pic-check-tuple jit-define +] PIC-CHECK-TUPLE jit-define ! Inline cache miss entry points : jit-load-return-address ( -- ) @@ -328,7 +331,7 @@ IN: bootstrap.x86 [ 0 [RIP+] EAX MOV rc-relative rel-safepoint -] \ jit-safepoint jit-define +] JIT-SAFEPOINT jit-define [ jit-start-context-and-delete diff --git a/basis/bootstrap/assembler/x86.factor b/basis/bootstrap/assembler/x86.factor index 2bd0ba7d03..fe6757898b 100644 --- a/basis/bootstrap/assembler/x86.factor +++ b/basis/bootstrap/assembler/x86.factor @@ -74,7 +74,7 @@ big-endian off ! See the comment for M\ x86.32 stack-cleanup in cpu.x86.32 0xffff RET f rc-absolute-2 rel-untagged -] callback-stub jit-define +] CALLBACK-STUB jit-define [ ! load literal @@ -83,11 +83,11 @@ big-endian off ds-reg bootstrap-cell ADD ! store literal on datastack ds-reg [] temp0 MOV -] jit-push jit-define +] JIT-PUSH-IMMEDIATE jit-define [ 0 CALL f rc-relative rel-word-pic -] jit-word-call jit-define +] JIT-WORD-CALL jit-define ! The *-signal-handler subprimitives are special-cased in vm/quotations.cpp ! not to trigger generation of a stack frame, so they can @@ -161,7 +161,7 @@ big-endian off 0 JNE f rc-relative rel-word ! jump to false branch if equal 0 JMP f rc-relative rel-word -] jit-if jit-define +] JIT-IF jit-define : jit->r ( -- ) rs-reg bootstrap-cell ADD @@ -215,19 +215,19 @@ big-endian off jit->r 0 CALL f rc-relative rel-word jit-r> -] jit-dip jit-define +] JIT-DIP jit-define [ jit-2>r 0 CALL f rc-relative rel-word jit-2r> -] jit-2dip jit-define +] JIT-2DIP jit-define [ jit-3>r 0 CALL f rc-relative rel-word jit-3r> -] jit-3dip jit-define +] JIT-3DIP jit-define [ ! load from stack @@ -243,17 +243,17 @@ big-endian off temp0 ds-reg [] MOV ds-reg bootstrap-cell SUB temp0 word-entry-point-offset [+] JMP -] jit-execute jit-define +] JIT-EXECUTE jit-define [ stack-reg stack-frame-size bootstrap-cell - SUB -] jit-prolog jit-define +] JIT-PROLOG jit-define [ stack-reg stack-frame-size bootstrap-cell - ADD -] jit-epilog jit-define +] JIT-EPILOG jit-define -[ 0 RET ] jit-return jit-define +[ 0 RET ] JIT-RETURN jit-define ! ! ! Polymorphic inline caches @@ -262,9 +262,9 @@ big-endian off ! Load a value from a stack position [ temp1 ds-reg 0x7f [+] MOV f rc-absolute-1 rel-untagged -] pic-load jit-define +] PIC-LOAD jit-define -[ temp1 tag-mask get AND ] pic-tag jit-define +[ temp1 tag-mask get AND ] PIC-TAG jit-define [ temp0 temp1 MOV @@ -273,13 +273,13 @@ big-endian off [ JNE ] [ temp1 temp0 tuple-class-offset [+] MOV ] jit-conditional -] pic-tuple jit-define +] PIC-TUPLE jit-define [ temp1 0x7f CMP f rc-absolute-1 rel-untagged -] pic-check-tag jit-define +] PIC-CHECK-TAG jit-define -[ 0 JE f rc-relative rel-word ] pic-hit jit-define +[ 0 JE f rc-relative rel-word ] PIC-HIT jit-define ! ! ! Megamorphic caches @@ -315,7 +315,7 @@ big-endian off temp0 word-entry-point-offset [+] JMP ! fall-through on miss ] jit-conditional -] mega-lookup jit-define +] MEGA-LOOKUP jit-define ! ! ! Sub-primitives diff --git a/basis/bootstrap/image/image-docs.factor b/basis/bootstrap/image/image-docs.factor index aae495aa52..f26570b3d2 100644 --- a/basis/bootstrap/image/image-docs.factor +++ b/basis/bootstrap/image/image-docs.factor @@ -17,9 +17,6 @@ ABOUT: "bootstrap.image" HELP: architecture { $var-description "Bootstrap architecture name" } ; -HELP: bootstrap-startup-quot -{ $var-description "This image's startup quotation or " { $link f } ". " } ; - HELP: define-sub-primitive { $values { "quot" quotation } { "word" word } } { $description "Defines a sub primitive by running the quotation which is supposed to output assembler code. The word is then used to call the assembly." } ; diff --git a/basis/bootstrap/image/image.factor b/basis/bootstrap/image/image.factor index dda459e595..8d281876d8 100755 --- a/basis/bootstrap/image/image.factor +++ b/basis/bootstrap/image/image.factor @@ -106,6 +106,8 @@ CONSTANT: -1-offset 9 SYMBOL: sub-primitives +SYMBOL: bs-special-objects + :: jit-conditional ( test-quot false-quot -- ) [ 0 test-quot call ] B{ } make length :> len building get length extra-offset get + len + @@ -126,8 +128,8 @@ SYMBOL: sub-primitives : make-jit-no-params ( quot -- code ) make-jit 2nip ; -: jit-define ( quot name -- ) - [ make-jit-no-params ] dip set ; +: jit-define ( quot n -- ) + [ make-jit-no-params ] dip bs-special-objects get set-at ; : define-sub-primitive ( quot word -- ) [ make-jit 3array ] dip sub-primitives get set-at ; @@ -143,7 +145,6 @@ SYMBOL: sub-primitives ] dip sub-primitives get set-at ; -! The image being constructed; a vector of word-size integers SYMBOL: bootstrapping-image ! Image output format @@ -151,68 +152,7 @@ SYMBOL: big-endian SYMBOL: architecture -RESET - -! Boot quotation, set in stage1.factor -SPECIAL-OBJECT: bootstrap-startup-quot 20 - -! Bootstrap global namesapce -SPECIAL-OBJECT: bootstrap-global 21 - -! JIT parameters -SPECIAL-OBJECT: jit-prolog 23 -SPECIAL-OBJECT: jit-primitive-word 24 -SPECIAL-OBJECT: jit-primitive 25 -SPECIAL-OBJECT: jit-word-jump 26 -SPECIAL-OBJECT: jit-word-call 27 -SPECIAL-OBJECT: jit-if-word 28 -SPECIAL-OBJECT: jit-if 29 -SPECIAL-OBJECT: jit-safepoint 30 -SPECIAL-OBJECT: jit-epilog 31 -SPECIAL-OBJECT: jit-return 32 -SPECIAL-OBJECT: jit-profiling 33 -SPECIAL-OBJECT: jit-push 34 -SPECIAL-OBJECT: jit-dip-word 35 -SPECIAL-OBJECT: jit-dip 36 -SPECIAL-OBJECT: jit-2dip-word 37 -SPECIAL-OBJECT: jit-2dip 38 -SPECIAL-OBJECT: jit-3dip-word 39 -SPECIAL-OBJECT: jit-3dip 40 -SPECIAL-OBJECT: jit-execute 41 -SPECIAL-OBJECT: jit-declare-word 42 - -SPECIAL-OBJECT: c-to-factor-word 43 -SPECIAL-OBJECT: lazy-jit-compile-word 44 -SPECIAL-OBJECT: unwind-native-frames-word 45 -SPECIAL-OBJECT: fpu-state-word 46 -SPECIAL-OBJECT: set-fpu-state-word 47 -SPECIAL-OBJECT: signal-handler-word 48 -SPECIAL-OBJECT: leaf-signal-handler-word 49 -SPECIAL-OBJECT: ffi-signal-handler-word 50 -SPECIAL-OBJECT: ffi-leaf-signal-handler-word 51 - -SPECIAL-OBJECT: callback-stub 53 - -! PIC stubs -SPECIAL-OBJECT: pic-load 54 -SPECIAL-OBJECT: pic-tag 55 -SPECIAL-OBJECT: pic-tuple 56 -SPECIAL-OBJECT: pic-check-tag 57 -SPECIAL-OBJECT: pic-check-tuple 58 -SPECIAL-OBJECT: pic-hit 59 -SPECIAL-OBJECT: pic-miss-word 60 -SPECIAL-OBJECT: pic-miss-tail-word 61 - -! Megamorphic dispatch -SPECIAL-OBJECT: mega-lookup 62 -SPECIAL-OBJECT: mega-lookup-word 63 -SPECIAL-OBJECT: mega-miss-word 64 - -! Default definition for undefined words -SPECIAL-OBJECT: undefined-quot 65 - -: special-object-offset ( symbol -- n ) - special-objects get at header-size + ; +H{ } clone bs-special-objects set-global : emit ( cell -- ) bootstrapping-image get push ; @@ -268,9 +208,6 @@ GENERIC: ' ( obj -- ptr ) 0 emit ! pointer to bignum -1 special-objects-size [ f ' emit ] times ; -: emit-special-object ( symbol -- ) - [ get ' ] [ special-object-offset ] bi fixup ; - ! Bignums : bignum-bits ( -- n ) bootstrap-cell-bits 2 - ; @@ -509,32 +446,41 @@ M: quotation ' class-and-cache class-or-cache next-method-quot-cache } [ H{ } clone global-box boa ] H{ } map>assoc assoc-union global-hashtable boa - bootstrap-global set ; + OBJ-GLOBAL bs-special-objects get set-at ; : emit-jit-data ( -- ) - \ if jit-if-word set - \ do-primitive jit-primitive-word set - \ dip jit-dip-word set - \ 2dip jit-2dip-word set - \ 3dip jit-3dip-word set - \ inline-cache-miss pic-miss-word set - \ inline-cache-miss-tail pic-miss-tail-word set - \ mega-cache-lookup mega-lookup-word set - \ mega-cache-miss mega-miss-word set - \ declare jit-declare-word set - \ c-to-factor c-to-factor-word set - \ lazy-jit-compile lazy-jit-compile-word set - \ unwind-native-frames unwind-native-frames-word set - \ fpu-state fpu-state-word set - \ set-fpu-state set-fpu-state-word set - \ signal-handler signal-handler-word set - \ leaf-signal-handler leaf-signal-handler-word set - \ ffi-signal-handler ffi-signal-handler-word set - \ ffi-leaf-signal-handler ffi-leaf-signal-handler-word set - undefined-def undefined-quot set ; + { + { JIT-IF-WORD if } + { JIT-PRIMITIVE-WORD do-primitive } + { JIT-DIP-WORD dip } + { JIT-2DIP-WORD 2dip } + { JIT-3DIP-WORD 3dip } + { PIC-MISS-WORD inline-cache-miss } + { PIC-MISS-TAIL-WORD inline-cache-miss-tail } + { MEGA-LOOKUP-WORD mega-cache-lookup } + { MEGA-MISS-WORD mega-cache-miss } + { JIT-DECLARE-WORD declare } + { C-TO-FACTOR-WORD c-to-factor } + { LAZY-JIT-COMPILE-WORD lazy-jit-compile } + { UNWIND-NATIVE-FRAMES-WORD unwind-native-frames } + { GET-FPU-STATE-WORD fpu-state } + { SET-FPU-STATE-WORD set-fpu-state } + { SIGNAL-HANDLER-WORD signal-handler } + { LEAF-SIGNAL-HANDLER-WORD leaf-signal-handler } + { FFI-SIGNAL-HANDLER-WORD ffi-signal-handler } + { FFI-LEAF-SIGNAL-HANDLER-WORD ffi-leaf-signal-handler } + } + \ OBJ-UNDEFINED undefined-def 2array suffix [ + swap execute( -- x ) bs-special-objects get set-at + ] assoc-each ; + +: emit-special-object ( obj idx -- ) + [ ' ] [ header-size + ] bi* fixup ; : emit-special-objects ( -- ) - special-objects get keys [ emit-special-object ] each ; + bs-special-objects get [ + swap emit-special-object + ] assoc-each ; : fixup-header ( -- ) heap-size data-heap-size-offset fixup ; diff --git a/core/bootstrap/stage1.factor b/core/bootstrap/stage1.factor index fd176d1376..4b747039df 100644 --- a/core/bootstrap/stage1.factor +++ b/core/bootstrap/stage1.factor @@ -55,4 +55,5 @@ load-help? off ] if ] % ] [ ] make -bootstrap.image.private:bootstrap-startup-quot set +OBJ-STARTUP-QUOT +bootstrap.image.private:bs-special-objects get set-at