some VOP refactoring

cvs
Slava Pestov 2005-12-05 00:56:42 +00:00
parent b165769d46
commit 0c68096656
7 changed files with 66 additions and 76 deletions

View File

@ -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 ;

View File

@ -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 )

View File

@ -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> ;

View File

@ -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 = ;

View File

@ -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 ;

View File

@ -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 ;

View File

@ -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