From 8c44395e3a51f0200cacd29af70737b914e91fa5 Mon Sep 17 00:00:00 2001 From: slava Date: Thu, 30 Mar 2006 21:13:11 +0000 Subject: [PATCH 001/112] Start 0.82 --- library/windows/load.factor | 2 +- version.factor | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/windows/load.factor b/library/windows/load.factor index f41cb2e218..e68cbfae05 100644 --- a/library/windows/load.factor +++ b/library/windows/load.factor @@ -32,4 +32,4 @@ USING: alien compiler kernel namespaces parser sequences words ; ] when IN: kernel -: default-shell "tty" ; +: default-shell "ui" ; diff --git a/version.factor b/version.factor index cd4fdfd04d..2f8468adf4 100644 --- a/version.factor +++ b/version.factor @@ -1,2 +1,2 @@ IN: kernel -: version "0.81" ; +: version "0.82" ; From ce48c96903fc1c2add6208a43f1ba95680af9987 Mon Sep 17 00:00:00 2001 From: slava Date: Thu, 30 Mar 2006 21:39:56 +0000 Subject: [PATCH 002/112] You can now define Objective C methods which return structures --- TODO.FACTOR.txt | 1 - library/cocoa/subclassing.factor | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/TODO.FACTOR.txt b/TODO.FACTOR.txt index 71281d07b8..959ae4d4ff 100644 --- a/TODO.FACTOR.txt +++ b/TODO.FACTOR.txt @@ -5,7 +5,6 @@ should fix in 0.82: - when generating a 32-bit image on a 64-bit system, large numbers which should be bignums become fixnums - httpd fep -- defining methods returning structs in objc - expired aliens in view hash - clicks sent twice - speed up ideas: diff --git a/library/cocoa/subclassing.factor b/library/cocoa/subclassing.factor index c231027dff..d84a3505d9 100644 --- a/library/cocoa/subclassing.factor +++ b/library/cocoa/subclassing.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. IN: objc USING: alien arrays compiler hashtables kernel kernel-internals -libc math namespaces sequences strings words ; +libc lists math namespaces sequences strings words ; : init-method ( method alien -- ) >r first3 r> @@ -64,13 +64,19 @@ libc math namespaces sequences strings words ; >r 1array r> append [ [ alien>objc-types get hash % CHAR: 0 , ] each ] "" make ; -: prepare-method ( { name ret types quot } -- { name type imp } ) - [ first3 encode-types ] keep - [ 1 swap tail % \ alien-callback , ] [ ] make compile-quot - 3array ; +: struct-return ( ret types quot -- ret types quot ) + pick c-struct? [ + pick c-size [ memcpy ] curry append + >r { "void*" } swap append >r drop "void" r> r> + ] when ; + +: prepare-method ( ret types quot -- type imp ) + >r [ encode-types ] 2keep r> + [ struct-return 3array % \ alien-callback , ] [ ] make + compile-quot ; : prepare-methods ( methods -- methods ) - [ prepare-method ] map ; + [ first4 prepare-method 3array ] map ; : define-objc-class ( superclass name imeth cmeth -- ) pick >r From 22c0257dbe11cea9cac659c93b1de222e893fc53 Mon Sep 17 00:00:00 2001 From: slava Date: Sat, 1 Apr 2006 01:16:03 +0000 Subject: [PATCH 003/112] Clear out expired aliens in Cocoa UI startup --- TODO.FACTOR.txt | 6 +++--- library/cocoa/ui.factor | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/TODO.FACTOR.txt b/TODO.FACTOR.txt index 959ae4d4ff..6930251b8f 100644 --- a/TODO.FACTOR.txt +++ b/TODO.FACTOR.txt @@ -1,17 +1,15 @@ should fix in 0.82: +- 3 >n fep - amd64 %box-struct - get factor running on mac intel - when generating a 32-bit image on a 64-bit system, large numbers which should be bignums become fixnums - httpd fep -- expired aliens in view hash - clicks sent twice - speed up ideas: - only do clipping for certain gadgets - use glRect -- remove , , set-char*-nth, set-ushort*-nth since they - have incorrect semantics - cocoa: global menu bar with useful commands + portability: @@ -58,6 +56,8 @@ should fix in 0.82: - core foundation should use unicode strings - alien>utf16-string, utf16-string>alien words - can only be called with an alien? +- remove , , set-char*-nth, set-ushort*-nth since they + have incorrect semantics - improve callback efficiency - float intrinsics - complex float type diff --git a/library/cocoa/ui.factor b/library/cocoa/ui.factor index fb0ba981e2..0dc64f8d63 100644 --- a/library/cocoa/ui.factor +++ b/library/cocoa/ui.factor @@ -3,11 +3,11 @@ IN: objc-FactorView DEFER: FactorView -USING: arrays cocoa errors freetype gadgets gadgets-launchpad -gadgets-layouts gadgets-listener gadgets-panes hashtables kernel -lists math namespaces objc objc-NSApplication objc-NSEvent -objc-NSObject objc-NSOpenGLContext objc-NSOpenGLView objc-NSView -objc-NSWindow sequences threads ; +USING: alien arrays cocoa errors freetype gadgets +gadgets-launchpad gadgets-layouts gadgets-listener gadgets-panes +hashtables kernel lists math namespaces objc objc-NSApplication +objc-NSEvent objc-NSObject objc-NSOpenGLContext +objc-NSOpenGLView objc-NSView objc-NSWindow sequences threads ; ! Cocoa backend for Factor UI @@ -18,6 +18,9 @@ SYMBOL: views H{ } clone views set-global +: purge-expired ( hash -- hash ) + [ drop expired? not ] hash-subset ; + : view ( handle -- world ) views get hash ; : mouse-location ( view event -- loc ) @@ -189,6 +192,7 @@ IN: shells [ [ init-ui + purge-expired launchpad-window listener-window finish-launching From da0633925cf0d0f530feb0ac24b9a8e7d9798fab Mon Sep 17 00:00:00 2001 From: slava Date: Sat, 1 Apr 2006 01:16:39 +0000 Subject: [PATCH 004/112] Refactor compiler code to deal with stack locations in a more orthogonal manner --- library/compiler/basic-blocks.factor | 15 +++---- library/compiler/intrinsics.factor | 32 ++++++++------- library/compiler/linearizer.factor | 18 +++++++-- library/compiler/stack.factor | 58 +++++++++++----------------- library/compiler/vops.factor | 28 +++----------- 5 files changed, 69 insertions(+), 82 deletions(-) diff --git a/library/compiler/basic-blocks.factor b/library/compiler/basic-blocks.factor index 5abd56c0ee..9fcab8a9d6 100644 --- a/library/compiler/basic-blocks.factor +++ b/library/compiler/basic-blocks.factor @@ -19,6 +19,7 @@ USING: arrays hashtables kernel lists math namespaces sequences ; : vop-in ( vop n -- input ) swap vop-inputs nth ; : set-vop-in ( input vop n -- ) swap vop-inputs set-nth ; : vop-out ( vop n -- input ) swap vop-outputs nth ; +: set-vop-out ( output vop n -- ) swap vop-outputs set-nth ; : (split-blocks) ( n linear -- ) 2dup length = [ @@ -49,17 +50,17 @@ M: %inc-d simplify-stack* ( vop -- ) d-height accum-height ; M: %inc-r simplify-stack* ( vop -- ) r-height accum-height ; -GENERIC: update-loc ( loc -- ) +GENERIC: update-loc ( loc -- loc ) -M: ds-loc update-loc - dup ds-loc-n d-height get - swap set-ds-loc-n ; +M: ds-loc update-loc ds-loc-n d-height get - ; -M: cs-loc update-loc - dup cs-loc-n r-height get - swap set-cs-loc-n ; +M: cs-loc update-loc cs-loc-n r-height get - ; -M: %peek simplify-stack* ( vop -- ) 0 vop-in update-loc ; +M: %peek simplify-stack* ( vop -- ) + 0 [ vop-in update-loc ] 2keep set-vop-in ; -M: %replace simplify-stack* ( vop -- ) 0 vop-out update-loc ; +M: %replace simplify-stack* ( vop -- ) + 0 [ vop-out update-loc ] 2keep set-vop-out ; : simplify-stack ( block -- ) #! Combine all %inc-d/%inc-r into two final ones. diff --git a/library/compiler/intrinsics.factor b/library/compiler/intrinsics.factor index dfd5f0f222..156e13f85a 100644 --- a/library/compiler/intrinsics.factor +++ b/library/compiler/intrinsics.factor @@ -64,7 +64,7 @@ namespaces sequences words ; in-2 -1 %inc-d , 0 1 %char-slot , - 1 0 %replace-d , + T{ vreg f 1 } T{ ds-loc f 0 } %replace , ] "intrinsic" set-word-prop \ set-char-slot [ @@ -102,23 +102,27 @@ namespaces sequences words ; -1 %inc-d , ] "intrinsic" set-word-prop -: value/vreg-list ( in -- list ) - [ 0 swap length 1- ] keep - [ >r 2dup r> 3array >r 1- >r 1+ r> r> ] map 2nip ; +GENERIC: load-value ( vreg loc value -- ) -: values>vregs ( in -- in ) - value/vreg-list - dup [ first3 load-value ] each - [ first ] map ; +M: object load-value ( vreg loc value -- ) + drop %peek , ; + +M: value load-value ( vreg loc value -- ) + nip value-literal swap load-literal ; : binary-inputs ( node -- in1 in2 ) - node-in-d values>vregs first2 swap ; + node-in-d + T{ vreg f 0 } T{ ds-loc f 1 } pick first load-value + T{ vreg f 1 } T{ ds-loc f 0 } rot second load-value + T{ vreg f 1 } T{ vreg f 0 } ; : binary-op-reg ( node op -- ) >r binary-inputs dup -1 %inc-d , r> execute , out-1 ; inline : binary-imm ( node -- in1 in2 ) - -1 %inc-d , in-1 node-peek value-literal 0 ; + -1 %inc-d , + T{ vreg f 0 } T{ ds-loc f 1 } pick node-peek load-value + node-peek value-literal T{ vreg f 0 } ; : binary-op-imm ( node op -- ) >r binary-imm dup r> execute , out-1 ; inline @@ -176,7 +180,7 @@ namespaces sequences words ; in-2 -1 %inc-d , 1 0 2 %fixnum-mod , - T{ vreg f 2 } 0 %replace-d , + T{ vreg f 2 } T{ ds-loc f 0 } %replace , ] "intrinsic" set-word-prop \ fixnum/mod [ @@ -186,8 +190,8 @@ namespaces sequences words ; { T{ vreg f 1 } T{ vreg f 0 } } { T{ vreg f 2 } T{ vreg f 0 } } %fixnum/mod , - T{ vreg f 2 } 0 %replace-d , - T{ vreg f 0 } 1 %replace-d , + T{ vreg f 2 } T{ ds-loc f 0 } %replace , + T{ vreg f 0 } T{ ds-loc f 1 } %replace , ] "intrinsic" set-word-prop \ fixnum-bitnot [ @@ -208,7 +212,7 @@ namespaces sequences words ; in-1 dup cell-bits neg <= [ drop 0 2 %fixnum-sgn , - T{ vreg f 2 } 0 %replace-d , + T{ vreg f 2 } T{ ds-loc f 0 } %replace , ] [ neg 0 0 %fixnum>> , out-1 diff --git a/library/compiler/linearizer.factor b/library/compiler/linearizer.factor index 39d8da2a46..6bd2443d43 100644 --- a/library/compiler/linearizer.factor +++ b/library/compiler/linearizer.factor @@ -81,10 +81,20 @@ M: #label linearize* ( node -- next ) renamed-label swap node-child linearize-1 r> ; -: in-1 0 0 %peek-d , ; -: in-2 0 1 %peek-d , 1 0 %peek-d , ; -: in-3 0 2 %peek-d , 1 1 %peek-d , 2 0 %peek-d , ; -: out-1 T{ vreg f 0 } 0 %replace-d , ; +: in-1 + T{ vreg f 0 } T{ ds-loc f 0 } %peek , ; + +: in-2 + T{ vreg f 0 } T{ ds-loc f 1 } %peek , + T{ vreg f 1 } T{ ds-loc f 0 } %peek , ; + +: in-3 + T{ vreg f 0 } T{ ds-loc f 2 } %peek , + T{ vreg f 1 } T{ ds-loc f 1 } %peek , + T{ vreg f 2 } T{ ds-loc f 0 } %peek , ; + +: out-1 + T{ vreg f 0 } T{ ds-loc f 0 } %replace , ; : intrinsic ( #call -- quot ) node-param "intrinsic" word-prop ; diff --git a/library/compiler/stack.factor b/library/compiler/stack.factor index 22e4ba42e8..6301a81d57 100644 --- a/library/compiler/stack.factor +++ b/library/compiler/stack.factor @@ -10,16 +10,8 @@ sequences vectors words ; #! by GC, and is indexed through a table. dup fixnum? swap f eq? or ; -GENERIC: load-value ( vreg n value -- ) - -M: object load-value ( vreg n value -- ) - drop %peek-d , ; - -: load-literal ( vreg obj -- ) - dup immediate? [ %immediate ] [ %indirect ] if , ; - -M: value load-value ( vreg n value -- ) - nip value-literal load-literal ; +: load-literal ( obj vreg -- ) + over immediate? [ %immediate ] [ %indirect ] if , ; SYMBOL: vreg-allocator SYMBOL: live-d @@ -31,53 +23,49 @@ SYMBOL: live-r rot live-r get member? not and or ; -: stack>vreg ( value stack-pos loader -- ) - pick >r vreg-allocator get r> set - pick value-dropped? [ pick get pick pick execute , ] unless - 3drop vreg-allocator inc ; inline +: stack>vreg ( value stack-pos -- ) + vreg-allocator get pick set + over value-dropped? [ 2drop ] [ >r get r> %peek , ] if + vreg-allocator inc ; -: (stacks>vregs) ( stack loader -- ) - swap reverse-slice dup length - [ pick stack>vreg ] 2each drop ; inline +: stacks<>vregs ( values quot quot -- ) + >r >r dup reverse-slice swap length r> map r> 2each ; inline : stacks>vregs ( #shuffle -- ) dup - node-in-d \ %peek-d (stacks>vregs) - node-in-r \ %peek-r (stacks>vregs) ; + node-in-d [ ] [ stack>vreg ] stacks<>vregs + node-in-r [ ] [ stack>vreg ] stacks<>vregs ; : shuffle-height ( #shuffle -- ) dup node-out-d length over node-in-d length - %inc-d , dup node-out-r length swap node-in-r length - %inc-r , ; -: literal>stack ( stack-pos value storer -- ) - >r value-literal r> fixnum-imm? pick immediate? and [ - >r 0 swap load-literal 0 r> - ] unless swapd execute , ; inline +: literal>stack ( value stack-pos -- ) + swap value-literal fixnum-imm? over immediate? and + [ T{ vreg f 0 } load-literal T{ vreg f 0 } ] unless + swap %replace , ; inline -: computed>stack >r get swap r> execute , ; - -: vreg>stack ( stack-pos value storer -- ) +: vreg>stack ( value stack-pos -- ) { - { [ over not ] [ 3drop ] } + { [ over not ] [ 2drop ] } { [ over value? ] [ literal>stack ] } - { [ t ] [ computed>stack ] } - } cond ; inline - -: (vregs>stack) ( stack storer -- ) - swap reverse-slice [ length ] keep - [ pick vreg>stack ] 2each drop ; inline + { [ t ] [ >r get r> %replace , ] } + } cond ; : (vregs>stacks) ( stack stack -- ) - \ %replace-r (vregs>stack) \ %replace-d (vregs>stack) ; + [ ] [ vreg>stack ] stacks<>vregs + [ ] [ vreg>stack ] stacks<>vregs ; : literals/computed ( stack -- literals computed ) dup [ dup value? [ drop f ] unless ] map swap [ dup value? [ drop f ] when ] map ; : vregs>stacks ( -- ) + #! We store literals last because storing a literal to a + #! stack slot actually clobbers a vreg. live-d get literals/computed live-r get literals/computed - swapd (vregs>stacks) (vregs>stacks) ; + swapd vregs>stacks vregs>stacks ; : live-stores ( instack outstack -- stack ) #! Avoid storing a value into its former position. diff --git a/library/compiler/vops.factor b/library/compiler/vops.factor index aa31799bed..291f7cda0c 100644 --- a/library/compiler/vops.factor +++ b/library/compiler/vops.factor @@ -153,53 +153,37 @@ C: %target-label make-vop ; ! stack operations TUPLE: %peek ; C: %peek make-vop ; - +: %peek swap src/dest-vop <%peek> ; M: %peek basic-block? drop t ; -: %peek swap src/dest-vop <%peek> ; - -: %peek-d ( vreg n -- vop ) %peek ; - -: %peek-r ( vreg n -- vop ) %peek ; - TUPLE: %replace ; C: %replace make-vop ; - -M: %replace basic-block? drop t ; - : %replace ( vreg loc -- vop ) src/dest-vop <%replace> ; - -: %replace-d ( vreg n -- vop ) %replace ; - -: %replace-r ( vreg n -- vop ) %replace ; +M: %replace basic-block? drop t ; TUPLE: %inc-d ; C: %inc-d make-vop ; : %inc-d ( n -- node ) src-vop <%inc-d> ; - M: %inc-d basic-block? drop t ; TUPLE: %inc-r ; - C: %inc-r make-vop ; - : %inc-r ( n -- ) src-vop <%inc-r> ; - M: %inc-r basic-block? drop t ; TUPLE: %immediate ; C: %immediate make-vop ; -: %immediate ( vreg obj -- vop ) - swap src/dest-vop <%immediate> ; +: %immediate ( obj vreg -- vop ) + src/dest-vop <%immediate> ; M: %immediate basic-block? drop t ; ! indirect load of a literal through a table TUPLE: %indirect ; C: %indirect make-vop ; -: %indirect ( vreg obj -- ) - swap src/dest-vop <%indirect> ; +: %indirect ( obj vreg -- ) + src/dest-vop <%indirect> ; M: %indirect basic-block? drop t ; ! object slot accessors From 0ff2dbc4e0b69c08def273d7a93a2e10b9c0eacc Mon Sep 17 00:00:00 2001 From: slava Date: Sun, 2 Apr 2006 00:48:17 +0000 Subject: [PATCH 005/112] Cocoa fixes --- Makefile | 2 ++ library/cocoa/ui.factor | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ad1f392d9e..03706e3120 100644 --- a/Makefile +++ b/Makefile @@ -117,6 +117,8 @@ macosx.app: -o -name '*.js' \) \ -exec ./cp_dir {} $(BUNDLE)/Contents/Resources/{} \; + cp version.factor $(BUNDLE)/Contents/Resources/ + cp $(IMAGE) $(BUNDLE)/Contents/Resources/factor.image install_name_tool \ diff --git a/library/cocoa/ui.factor b/library/cocoa/ui.factor index 0dc64f8d63..85360b424b 100644 --- a/library/cocoa/ui.factor +++ b/library/cocoa/ui.factor @@ -18,8 +18,10 @@ SYMBOL: views H{ } clone views set-global -: purge-expired ( hash -- hash ) - [ drop expired? not ] hash-subset ; +: purge-views ( hash -- hash ) + global [ + views [ [ drop expired? not ] hash-subset ] change + ] bind ; : view ( handle -- world ) views get hash ; @@ -192,7 +194,7 @@ IN: shells [ [ init-ui - purge-expired + purge-views launchpad-window listener-window finish-launching From cfdefab51824333c00644b42db3f7c92cfcd12a8 Mon Sep 17 00:00:00 2001 From: slava Date: Sun, 2 Apr 2006 00:50:33 +0000 Subject: [PATCH 006/112] vreg usage cleanups --- library/compiler/intrinsics.factor | 150 +++++++++++----------------- library/compiler/linearizer.factor | 60 ++++++++--- library/compiler/stack.factor | 14 +-- library/compiler/vops.factor | 31 +++--- library/freetype/freetype-gl.factor | 2 +- 5 files changed, 118 insertions(+), 139 deletions(-) diff --git a/library/compiler/intrinsics.factor b/library/compiler/intrinsics.factor index 156e13f85a..fd64cd59cb 100644 --- a/library/compiler/intrinsics.factor +++ b/library/compiler/intrinsics.factor @@ -1,5 +1,5 @@ -! Copyright (C) 2005 Slava Pestov. -! See http://factor.sf.net/license.txt for BSD license. +! Copyright (C) 2005, 2006 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. IN: compiler-frontend USING: arrays assembler compiler-backend generic hashtables inference kernel kernel-internals lists math math-internals @@ -32,111 +32,92 @@ namespaces sequences words ; \ slot [ dup slot@ [ -1 %inc-d , - in-1 - 0 swap slot@ %fast-slot , + dup in-1 >r slot@ r> %fast-slot , ] [ - drop - in-2 + in-2 swap -1 %inc-d , - 0 %untag , - 1 0 %slot , - ] if out-1 + dup %untag , + %slot , + ] if T{ vreg f 0 } out-1 ] "intrinsic" set-word-prop \ set-slot [ dup slot@ [ -1 %inc-d , - in-2 + dup in-2 -2 %inc-d , - slot@ >r 0 1 r> %fast-set-slot , + rot slot@ %fast-set-slot , ] [ - drop in-3 -3 %inc-d , - 1 %untag , - 0 1 2 %set-slot , + over %untag , + %set-slot , ] if - 1 %write-barrier , + T{ vreg f 1 } %write-barrier , ] "intrinsic" set-word-prop \ char-slot [ - drop in-2 -1 %inc-d , - 0 1 %char-slot , - T{ vreg f 1 } T{ ds-loc f 0 } %replace , + [ %char-slot , ] keep + out-1 ] "intrinsic" set-word-prop \ set-char-slot [ - drop in-3 -3 %inc-d , - 0 2 1 %set-char-slot , + swap %set-char-slot , ] "intrinsic" set-word-prop \ type [ - drop - in-1 - 0 %type , - out-1 + in-1 [ %type , ] keep out-1 ] "intrinsic" set-word-prop \ tag [ - drop - in-1 - 0 %tag , - out-1 + in-1 [ %tag , ] keep out-1 ] "intrinsic" set-word-prop \ getenv [ - -1 %inc-d , - node-peek value-literal 0 swap %getenv , - 1 %inc-d , - out-1 + T{ vreg f 0 } [ + -1 %inc-d , + swap node-peek value-literal %getenv , + 1 %inc-d , + ] keep out-1 ] "intrinsic" set-word-prop -\ setenv [ - -1 %inc-d , - in-1 - node-peek value-literal 0 swap %setenv , - -1 %inc-d , -] "intrinsic" set-word-prop - -GENERIC: load-value ( vreg loc value -- ) - -M: object load-value ( vreg loc value -- ) - drop %peek , ; - -M: value load-value ( vreg loc value -- ) - nip value-literal swap load-literal ; - -: binary-inputs ( node -- in1 in2 ) - node-in-d - T{ vreg f 0 } T{ ds-loc f 1 } pick first load-value - T{ vreg f 1 } T{ ds-loc f 0 } rot second load-value - T{ vreg f 1 } T{ vreg f 0 } ; - -: binary-op-reg ( node op -- ) - >r binary-inputs dup -1 %inc-d , r> execute , out-1 ; inline - : binary-imm ( node -- in1 in2 ) - -1 %inc-d , - T{ vreg f 0 } T{ ds-loc f 1 } pick node-peek load-value - node-peek value-literal T{ vreg f 0 } ; + node-in-d { T{ vreg f 0 } f } intrinsic-inputs first2 swap + -2 %inc-d , ; -: binary-op-imm ( node op -- ) - >r binary-imm dup r> execute , out-1 ; inline +\ setenv [ + binary-imm + %setenv , +] "intrinsic" set-word-prop + +: binary-reg ( node -- in1 in2 ) + node-in-d { T{ vreg f 0 } T{ vreg f 1 } } intrinsic-inputs + first2 swap -2 %inc-d , ; : literal-immediate? ( value -- ? ) dup value? [ value-literal immediate? ] [ drop f ] if ; -: binary-op-imm? ( node -- ? ) - fixnum-imm? >r node-peek literal-immediate? r> and ; +: (binary-op) ( node -- in1 in2 ) + fixnum-imm? [ + dup node-peek literal-immediate? + [ binary-imm ] [ binary-reg ] if + ] [ + binary-reg + ] if ; : binary-op ( node op -- ) - #! out is a vreg where the vop stores the result. - over binary-op-imm? - [ binary-op-imm ] [ binary-op-reg ] if ; + >r (binary-op) dup r> execute , + 1 %inc-d , + T{ vreg f 0 } out-1 ; inline + +: binary-op-reg ( node op -- ) + >r binary-reg dup r> execute , + 1 %inc-d , + T{ vreg f 0 } out-1 ; inline { { fixnum+ %fixnum+ } @@ -148,15 +129,8 @@ M: value load-value ( vreg loc value -- ) first2 [ binary-op ] curry "intrinsic" set-word-prop ] each -: binary-jump-reg ( node label op -- ) - >r >r binary-inputs -2 %inc-d , r> r> execute , ; inline - -: binary-jump-imm ( node label op -- ) - >r >r binary-imm -1 %inc-d , r> r> execute , ; inline - : binary-jump ( node label op -- ) - pick binary-op-imm? - [ binary-jump-imm ] [ binary-jump-reg ] if ; + >r >r (binary-op) r> r> execute , ; inline { { fixnum<= %jump-fixnum<= } @@ -176,29 +150,21 @@ M: value load-value ( vreg loc value -- ) ! This is not clever. Because of x86, %fixnum-mod is ! hard-coded to put its output in vreg 2, which happends to ! be EDX there. - drop - in-2 + in-2 swap -1 %inc-d , - 1 0 2 %fixnum-mod , - T{ vreg f 2 } T{ ds-loc f 0 } %replace , + [ dup %fixnum-mod , ] keep out-1 ] "intrinsic" set-word-prop \ fixnum/mod [ ! See the remark on fixnum-mod for vreg usage - drop - in-2 - { T{ vreg f 1 } T{ vreg f 0 } } + in-2 swap 2array { T{ vreg f 2 } T{ vreg f 0 } } %fixnum/mod , - T{ vreg f 2 } T{ ds-loc f 0 } %replace , - T{ vreg f 0 } T{ ds-loc f 1 } %replace , + { T{ vreg f 0 } T{ vreg f 2 } } out-n ] "intrinsic" set-word-prop \ fixnum-bitnot [ - drop - in-1 - 0 0 %fixnum-bitnot , - out-1 + in-1 [ dup %fixnum-bitnot , ] keep out-1 ] "intrinsic" set-word-prop \ fixnum* [ @@ -209,13 +175,13 @@ M: value load-value ( vreg loc value -- ) : negative-shift ( n -- ) -1 %inc-d , - in-1 + { f } { T{ vreg f 0 } } intrinsic-inputs drop dup cell-bits neg <= [ - drop 0 2 %fixnum-sgn , - T{ vreg f 2 } T{ ds-loc f 0 } %replace , + drop T{ vreg f 0 } T{ vreg f 2 } %fixnum-sgn , + T{ vreg f 2 } out-1 ] [ - neg 0 0 %fixnum>> , - out-1 + neg T{ vreg f 0 } T{ vreg f 0 } %fixnum>> , + T{ vreg f 0 } out-1 ] if ; : fast-shift ( n -- ) diff --git a/library/compiler/linearizer.factor b/library/compiler/linearizer.factor index 6bd2443d43..620b31068e 100644 --- a/library/compiler/linearizer.factor +++ b/library/compiler/linearizer.factor @@ -81,20 +81,45 @@ M: #label linearize* ( node -- next ) renamed-label swap node-child linearize-1 r> ; -: in-1 - T{ vreg f 0 } T{ ds-loc f 0 } %peek , ; +: immediate? ( obj -- ? ) + #! fixnums and f have a pointerless representation, and + #! are compiled immediately. Everything else can be moved + #! by GC, and is indexed through a table. + dup fixnum? swap f eq? or ; -: in-2 - T{ vreg f 0 } T{ ds-loc f 1 } %peek , - T{ vreg f 1 } T{ ds-loc f 0 } %peek , ; +: load-literal ( obj vreg -- ) + over immediate? [ %immediate ] [ %indirect ] if , ; -: in-3 - T{ vreg f 0 } T{ ds-loc f 2 } %peek , - T{ vreg f 1 } T{ ds-loc f 1 } %peek , - T{ vreg f 2 } T{ ds-loc f 0 } %peek , ; +GENERIC: load-value ( vreg loc value -- operand ) -: out-1 - T{ vreg f 0 } T{ ds-loc f 0 } %replace , ; +M: object load-value ( vreg loc value -- operand ) + drop dupd %peek , ; + +M: value load-value ( vreg loc value -- operand ) + nip value-literal swap [ [ load-literal ] keep ] when* ; + +: intrinsic-inputs ( seq template -- inputs ) + dup length reverse-slice [ ] map rot 3array flip + [ first3 load-value ] map ; + +: in-1 ( node -- operand ) + node-in-d { T{ vreg f 0 } } intrinsic-inputs first ; + +: in-2 ( node -- operand operand ) + node-in-d { T{ vreg f 0 } T{ vreg f 1 } } + intrinsic-inputs first2 ; + +: in-3 ( node -- operand operand operand ) + node-in-d { T{ vreg f 0 } T{ vreg f 1 } T{ vreg f 2 } } + intrinsic-inputs first3 ; + +: stacks<>vregs ( values quot quot -- ) + >r >r dup reverse-slice swap length r> map r> 2each ; inline + +: out-n ( vregs -- ) + [ ] [ %replace , ] stacks<>vregs ; + +: out-1 ( vreg -- ) 1array out-n ; : intrinsic ( #call -- quot ) node-param "intrinsic" word-prop ; @@ -128,14 +153,17 @@ M: #if linearize* ( node -- next ) -1 %inc-d , swap node-children nth linearize-child iterate-next ] [ - in-1 -1 %inc-d ,