some VOP refactoring
parent
b165769d46
commit
0c68096656
|
@ -19,7 +19,7 @@ GENERIC: generate-node ( vop -- )
|
||||||
compiled-offset >r
|
compiled-offset >r
|
||||||
compile-aligned
|
compile-aligned
|
||||||
swap save-xt
|
swap save-xt
|
||||||
[ [ generate-node ] each ] each
|
[ [ dup [ generate-node ] with-vop ] each ] each
|
||||||
compile-aligned
|
compile-aligned
|
||||||
compiled-offset r> - ;
|
compiled-offset r> - ;
|
||||||
|
|
||||||
|
@ -66,12 +66,6 @@ M: %target generate-node
|
||||||
|
|
||||||
M: %parameters generate-node ( vop -- ) drop ;
|
M: %parameters generate-node ( vop -- ) drop ;
|
||||||
|
|
||||||
GENERIC: v>operand
|
|
||||||
|
|
||||||
M: integer v>operand tag-bits shift ;
|
|
||||||
|
|
||||||
M: f v>operand address ;
|
|
||||||
|
|
||||||
: dest/src ( vop -- dest src )
|
: dest/src ( vop -- dest src )
|
||||||
dup 0 vop-out v>operand swap 0 vop-in v>operand ;
|
dup 0 vop-out v>operand swap 0 vop-in v>operand ;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,11 @@ IN: compiler-frontend
|
||||||
USING: arrays compiler-backend errors generic inference kernel
|
USING: arrays compiler-backend errors generic inference kernel
|
||||||
lists math namespaces prettyprint sequences strings words ;
|
lists math namespaces prettyprint sequences strings words ;
|
||||||
|
|
||||||
|
: 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 , ;
|
||||||
|
|
||||||
GENERIC: linearize* ( node -- )
|
GENERIC: linearize* ( node -- )
|
||||||
|
|
||||||
: linearize ( dataflow -- linear )
|
: linearize ( dataflow -- linear )
|
||||||
|
|
|
@ -43,13 +43,25 @@ TUPLE: cs-loc n ;
|
||||||
! A pseudo-register class for parameters spilled on the stack
|
! A pseudo-register class for parameters spilled on the stack
|
||||||
TUPLE: stack-params ;
|
TUPLE: stack-params ;
|
||||||
|
|
||||||
|
GENERIC: v>operand
|
||||||
|
|
||||||
|
M: integer v>operand tag-bits shift ;
|
||||||
|
|
||||||
|
M: f v>operand address ;
|
||||||
|
|
||||||
! A virtual operation
|
! A virtual operation
|
||||||
TUPLE: vop inputs outputs label ;
|
TUPLE: vop inputs outputs label ;
|
||||||
|
|
||||||
: vop-in ( vop n -- input ) swap vop-inputs nth ;
|
: vop-in ( vop n -- input ) swap vop-inputs nth ;
|
||||||
: set-vop-in ( input vop n -- ) swap vop-inputs set-nth ;
|
: set-vop-in ( input vop n -- ) swap vop-inputs set-nth ;
|
||||||
: vop-out ( vop n -- input ) swap vop-outputs nth ;
|
: vop-out ( vop n -- input ) swap vop-outputs nth ;
|
||||||
: set-vop-out ( input vop n -- ) swap vop-outputs set-nth ;
|
|
||||||
|
: with-vop ( vop quot -- ) [ vop set call ] with-scope ; inline
|
||||||
|
: input ( n -- obj ) vop get vop-inputs nth ;
|
||||||
|
: input-operand ( n -- n ) input v>operand ;
|
||||||
|
: output ( n -- obj ) vop get vop-outputs nth ;
|
||||||
|
: output-operand ( n -- n ) output v>operand ;
|
||||||
|
: label ( -- label ) vop get vop-label ;
|
||||||
|
|
||||||
GENERIC: basic-block? ( vop -- ? )
|
GENERIC: basic-block? ( vop -- ? )
|
||||||
M: vop basic-block? drop f ;
|
M: vop basic-block? drop f ;
|
||||||
|
@ -77,6 +89,12 @@ M: vop stack-reserve drop 0 ;
|
||||||
: 2-vop ( in dest) [ 2array ] keep 1array f ;
|
: 2-vop ( in dest) [ 2array ] keep 1array f ;
|
||||||
: 3-vop ( in1 in2 dest) >r 2array r> 1array f ;
|
: 3-vop ( in1 in2 dest) >r 2array r> 1array f ;
|
||||||
|
|
||||||
|
: check-dest ( vop reg -- )
|
||||||
|
swap 0 vop-out = [ "bad VOP destination" throw ] unless ;
|
||||||
|
|
||||||
|
: check-src ( vop reg -- )
|
||||||
|
swap 0 vop-in = [ "bad VOP source" throw ] unless ;
|
||||||
|
|
||||||
! miscellanea
|
! miscellanea
|
||||||
TUPLE: %prologue ;
|
TUPLE: %prologue ;
|
||||||
C: %prologue make-vop ;
|
C: %prologue make-vop ;
|
||||||
|
@ -179,11 +197,6 @@ C: %immediate make-vop ;
|
||||||
|
|
||||||
M: %immediate basic-block? drop t ;
|
M: %immediate basic-block? drop t ;
|
||||||
|
|
||||||
: 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 , ;
|
|
||||||
|
|
||||||
! indirect load of a literal through a table
|
! indirect load of a literal through a table
|
||||||
TUPLE: %indirect ;
|
TUPLE: %indirect ;
|
||||||
C: %indirect make-vop ;
|
C: %indirect make-vop ;
|
||||||
|
@ -334,12 +347,6 @@ C: %tag make-vop ;
|
||||||
: %tag ( vreg ) <vreg> dest-vop <%tag> ;
|
: %tag ( vreg ) <vreg> dest-vop <%tag> ;
|
||||||
M: %tag basic-block? drop t ;
|
M: %tag basic-block? drop t ;
|
||||||
|
|
||||||
: check-dest ( vop reg -- )
|
|
||||||
swap 0 vop-out = [ "bad VOP destination" throw ] unless ;
|
|
||||||
|
|
||||||
: check-src ( vop reg -- )
|
|
||||||
swap 0 vop-in = [ "bad VOP source" throw ] unless ;
|
|
||||||
|
|
||||||
TUPLE: %getenv ;
|
TUPLE: %getenv ;
|
||||||
C: %getenv make-vop ;
|
C: %getenv make-vop ;
|
||||||
: %getenv swap src/dest-vop <%getenv> ;
|
: %getenv swap src/dest-vop <%getenv> ;
|
||||||
|
|
|
@ -47,25 +47,6 @@ REGISTER: EBP 5 32
|
||||||
REGISTER: ESI 6 32
|
REGISTER: ESI 6 32
|
||||||
REGISTER: EDI 7 32
|
REGISTER: EDI 7 32
|
||||||
|
|
||||||
! AMD64 registers
|
|
||||||
REGISTER: RAX 0 64
|
|
||||||
REGISTER: RCX 1 64
|
|
||||||
REGISTER: RDX 2 64
|
|
||||||
REGISTER: RBX 3 64
|
|
||||||
REGISTER: RSP 4 64
|
|
||||||
REGISTER: RBP 5 64
|
|
||||||
REGISTER: RSI 6 64
|
|
||||||
REGISTER: RDI 7 64
|
|
||||||
|
|
||||||
REGISTER: R8 8 64
|
|
||||||
REGISTER: R9 9 64
|
|
||||||
REGISTER: R10 10 64
|
|
||||||
REGISTER: R11 11 64
|
|
||||||
REGISTER: R12 12 64
|
|
||||||
REGISTER: R13 13 64
|
|
||||||
REGISTER: R14 14 64
|
|
||||||
REGISTER: R15 15 64
|
|
||||||
|
|
||||||
PREDICATE: word register "register" word-prop ;
|
PREDICATE: word register "register" word-prop ;
|
||||||
|
|
||||||
PREDICATE: register register-32 "register-size" word-prop 32 = ;
|
PREDICATE: register register-32 "register-size" word-prop 32 = ;
|
||||||
|
|
|
@ -13,22 +13,26 @@ M: %prologue generate-node drop ;
|
||||||
: compile-c-call ( symbol dll -- ) [ CALL ] compile-dlsym ;
|
: compile-c-call ( symbol dll -- ) [ CALL ] compile-dlsym ;
|
||||||
|
|
||||||
M: %call generate-node ( vop -- )
|
M: %call generate-node ( vop -- )
|
||||||
vop-label dup postpone-word CALL ;
|
drop label dup postpone-word CALL ;
|
||||||
|
|
||||||
M: %call-label generate-node ( vop -- )
|
M: %call-label generate-node ( vop -- )
|
||||||
vop-label CALL ;
|
drop label CALL ;
|
||||||
|
|
||||||
M: %jump generate-node ( vop -- )
|
M: %jump generate-node ( vop -- )
|
||||||
vop-label dup postpone-word JMP ;
|
drop label dup postpone-word JMP ;
|
||||||
|
|
||||||
M: %jump-label generate-node ( vop -- )
|
M: %jump-label generate-node ( vop -- )
|
||||||
vop-label JMP ;
|
drop label JMP ;
|
||||||
|
|
||||||
M: %jump-t generate-node ( vop -- )
|
M: %jump-t generate-node ( vop -- )
|
||||||
dup 0 vop-in v>operand f address CMP vop-label JNE ;
|
drop
|
||||||
|
! Compare input with f
|
||||||
|
0 input-operand f address CMP
|
||||||
|
! If not equal, jump
|
||||||
|
label JNE ;
|
||||||
|
|
||||||
M: %return-to generate-node ( vop -- )
|
M: %return-to generate-node ( vop -- )
|
||||||
0 PUSH vop-label absolute ;
|
drop 0 PUSH label absolute-4 ;
|
||||||
|
|
||||||
M: %return generate-node ( vop -- )
|
M: %return generate-node ( vop -- )
|
||||||
drop RET ;
|
drop RET ;
|
||||||
|
@ -37,34 +41,35 @@ M: %dispatch generate-node ( vop -- )
|
||||||
#! Compile a piece of code that jumps to an offset in a
|
#! Compile a piece of code that jumps to an offset in a
|
||||||
#! jump table indexed by the fixnum at the top of the stack.
|
#! jump table indexed by the fixnum at the top of the stack.
|
||||||
#! The jump table must immediately follow this macro.
|
#! The jump table must immediately follow this macro.
|
||||||
0 vop-in v>operand
|
<label> "end" set
|
||||||
|
drop
|
||||||
! Untag and multiply by 4 to get a jump table offset
|
! Untag and multiply by 4 to get a jump table offset
|
||||||
dup tag-bits 2 - SHR
|
0 input-operand tag-bits 2 - SHR
|
||||||
! Add to jump table base
|
! Add to jump table base
|
||||||
dup HEX: ffff ADD just-compiled >r 0 0 rel-address
|
0 input-operand HEX: ffff ADD "end" get absolute-4
|
||||||
! Jump to jump table entry
|
! Jump to jump table entry
|
||||||
1array JMP
|
0 input-operand 1array JMP
|
||||||
! Align for better performance
|
! Align for better performance
|
||||||
compile-aligned
|
compile-aligned
|
||||||
! Fix up jump table pointer
|
! Fix up jump table pointer
|
||||||
compiled-offset r> set-compiled-cell ( fixup -- ) ;
|
"end" get save-xt ;
|
||||||
|
|
||||||
M: %type generate-node ( vop -- )
|
M: %type generate-node ( vop -- )
|
||||||
#! Intrinstic version of type primitive.
|
#! Intrinstic version of type primitive.
|
||||||
|
drop
|
||||||
<label> "header" set
|
<label> "header" set
|
||||||
<label> "f" set
|
<label> "f" set
|
||||||
<label> "end" set
|
<label> "end" set
|
||||||
0 vop-out v>operand
|
|
||||||
! Make a copy
|
! Make a copy
|
||||||
ECX over MOV
|
ECX 0 output-operand MOV
|
||||||
! Get the tag
|
! Get the tag
|
||||||
dup tag-mask AND
|
0 output-operand tag-mask AND
|
||||||
! Compare with object tag number (3).
|
! Compare with object tag number (3).
|
||||||
dup object-tag CMP
|
0 output-operand object-tag CMP
|
||||||
! Jump if the object doesn't store type info in its header
|
! Jump if the object doesn't store type info in its header
|
||||||
"header" get JE
|
"header" get JE
|
||||||
! It doesn't store type info in its header
|
! It doesn't store type info in its header
|
||||||
dup tag-bits SHL
|
0 output-operand tag-bits SHL
|
||||||
"end" get JMP
|
"end" get JMP
|
||||||
"header" get save-xt
|
"header" get save-xt
|
||||||
! It does store type info in its header
|
! It does store type info in its header
|
||||||
|
@ -72,19 +77,20 @@ M: %type generate-node ( vop -- )
|
||||||
ECX object-tag CMP
|
ECX object-tag CMP
|
||||||
"f" get JE
|
"f" get JE
|
||||||
! The pointer is not equal to 3. Load the object header.
|
! The pointer is not equal to 3. Load the object header.
|
||||||
dup ECX object-tag neg 2array MOV
|
0 output-operand ECX object-tag neg 2array MOV
|
||||||
! Mask off header tag, making a fixnum.
|
! Mask off header tag, making a fixnum.
|
||||||
dup object-tag XOR
|
0 output-operand object-tag XOR
|
||||||
"end" get JMP
|
"end" get JMP
|
||||||
"f" get save-xt
|
"f" get save-xt
|
||||||
! The pointer is equal to 3. Load F_TYPE (9).
|
! The pointer is equal to 3. Load F_TYPE (9).
|
||||||
f type tag-bits shift MOV
|
0 output-operand f type tag-bits shift MOV
|
||||||
"end" get save-xt ;
|
"end" get save-xt ;
|
||||||
|
|
||||||
M: %tag generate-node ( vop -- )
|
M: %tag generate-node ( vop -- )
|
||||||
dup dup 0 vop-in check-dest
|
drop
|
||||||
0 vop-in v>operand dup tag-mask AND
|
0 input-operand tag-mask AND
|
||||||
tag-bits SHL ;
|
0 input-operand tag-bits SHL ;
|
||||||
|
|
||||||
M: %untag generate-node ( vop -- )
|
M: %untag generate-node ( vop -- )
|
||||||
0 vop-out v>operand tag-mask bitnot AND ;
|
drop
|
||||||
|
0 output-operand tag-mask bitnot AND ;
|
||||||
|
|
|
@ -6,30 +6,28 @@ kernel-internals lists math memory sequences words ;
|
||||||
|
|
||||||
: reg-stack ( n reg -- op ) swap cell * neg 2array ;
|
: reg-stack ( n reg -- op ) swap cell * neg 2array ;
|
||||||
|
|
||||||
GENERIC: loc>operand
|
M: ds-loc v>operand ds-loc-n ds-reg reg-stack ;
|
||||||
|
|
||||||
M: ds-loc loc>operand ds-loc-n ds-reg reg-stack ;
|
M: cs-loc v>operand cs-loc-n cs-reg reg-stack ;
|
||||||
|
|
||||||
M: cs-loc loc>operand cs-loc-n cs-reg reg-stack ;
|
|
||||||
|
|
||||||
M: %peek generate-node ( vop -- )
|
M: %peek generate-node ( vop -- )
|
||||||
dup 0 vop-out v>operand swap 0 vop-in loc>operand MOV ;
|
drop 0 output-operand 0 input-operand MOV ;
|
||||||
|
|
||||||
M: %replace generate-node ( vop -- )
|
M: %replace generate-node ( vop -- )
|
||||||
dup 0 vop-out loc>operand swap 0 vop-in v>operand MOV ;
|
drop 0 output-operand 0 input-operand MOV ;
|
||||||
|
|
||||||
: (%inc) swap 0 vop-in cell * dup 0 > [ ADD ] [ neg SUB ] if ;
|
: (%inc) 0 input cell * dup 0 > [ ADD ] [ neg SUB ] if ;
|
||||||
|
|
||||||
M: %inc-d generate-node ( vop -- ) ds-reg (%inc) ;
|
M: %inc-d generate-node ( vop -- ) drop ds-reg (%inc) ;
|
||||||
|
|
||||||
M: %inc-r generate-node ( vop -- ) cs-reg (%inc) ;
|
M: %inc-r generate-node ( vop -- ) drop cs-reg (%inc) ;
|
||||||
|
|
||||||
M: %immediate generate-node ( vop -- )
|
M: %immediate generate-node ( vop -- )
|
||||||
dup 0 vop-out v>operand swap 0 vop-in address MOV ;
|
drop 0 output-operand 0 input address MOV ;
|
||||||
|
|
||||||
: load-indirect ( dest literal -- )
|
: load-indirect ( dest literal -- )
|
||||||
add-literal 1array MOV 0 0 rel-address ;
|
add-literal 1array MOV 0 0 rel-address ;
|
||||||
|
|
||||||
M: %indirect generate-node ( vop -- )
|
M: %indirect generate-node ( vop -- )
|
||||||
#! indirect load of a literal through a table
|
#! indirect load of a literal through a table
|
||||||
dup 0 vop-out v>operand swap 0 vop-in load-indirect ;
|
drop 0 output-operand 0 input load-indirect ;
|
||||||
|
|
|
@ -17,8 +17,7 @@ SYMBOL: compiled-xts
|
||||||
: commit-xts ( -- )
|
: commit-xts ( -- )
|
||||||
#! We must flush the instruction cache on PowerPC.
|
#! We must flush the instruction cache on PowerPC.
|
||||||
flush-icache
|
flush-icache
|
||||||
compiled-xts get [ swap set-word-xt ] hash-each
|
compiled-xts get [ swap set-word-xt ] hash-each ;
|
||||||
compiled-xts off ;
|
|
||||||
|
|
||||||
: compiled-xt ( word -- xt )
|
: compiled-xt ( word -- xt )
|
||||||
dup compiled-xts get hash [ ] [ word-xt ] ?if ;
|
dup compiled-xts get hash [ ] [ word-xt ] ?if ;
|
||||||
|
@ -140,11 +139,11 @@ SYMBOL: compile-words
|
||||||
[ drop t ] [ compiled-xts get hash ] if ;
|
[ drop t ] [ compiled-xts get hash ] if ;
|
||||||
|
|
||||||
: fixup-xts ( -- )
|
: fixup-xts ( -- )
|
||||||
deferred-xts get [ fixup ] each deferred-xts off ;
|
deferred-xts get [ dup resolve swap fixup ] each ;
|
||||||
|
|
||||||
: with-compiler ( quot -- )
|
: with-compiler ( quot -- )
|
||||||
[
|
[
|
||||||
V{ } deferred-xts set
|
V{ } clone deferred-xts set
|
||||||
H{ } clone compiled-xts set
|
H{ } clone compiled-xts set
|
||||||
V{ } clone compile-words set
|
V{ } clone compile-words set
|
||||||
call
|
call
|
||||||
|
|
Loading…
Reference in New Issue