From 0c68096656fdcca2e6763b87630fef679aceca92 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 5 Dec 2005 00:56:42 +0000 Subject: [PATCH] some VOP refactoring --- library/compiler/generator.factor | 8 +---- library/compiler/linearizer.factor | 5 +++ library/compiler/vops.factor | 31 +++++++++------- library/compiler/x86/assembler.factor | 19 ---------- library/compiler/x86/generator.factor | 52 +++++++++++++++------------ library/compiler/x86/stack.factor | 20 +++++------ library/compiler/xt.factor | 7 ++-- 7 files changed, 66 insertions(+), 76 deletions(-) diff --git a/library/compiler/generator.factor b/library/compiler/generator.factor index 86f640132f..c4d51ffa8b 100644 --- a/library/compiler/generator.factor +++ b/library/compiler/generator.factor @@ -19,7 +19,7 @@ GENERIC: generate-node ( vop -- ) compiled-offset >r compile-aligned swap save-xt - [ [ generate-node ] each ] each + [ [ dup [ generate-node ] with-vop ] each ] each compile-aligned compiled-offset r> - ; @@ -66,12 +66,6 @@ M: %target generate-node 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 ) dup 0 vop-out v>operand swap 0 vop-in v>operand ; diff --git a/library/compiler/linearizer.factor b/library/compiler/linearizer.factor index 48273771c3..524f0f72b5 100644 --- a/library/compiler/linearizer.factor +++ b/library/compiler/linearizer.factor @@ -4,6 +4,11 @@ IN: compiler-frontend USING: arrays compiler-backend errors generic inference kernel 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 -- ) : linearize ( dataflow -- linear ) diff --git a/library/compiler/vops.factor b/library/compiler/vops.factor index 531b167720..7cbcebb1fb 100644 --- a/library/compiler/vops.factor +++ b/library/compiler/vops.factor @@ -43,13 +43,25 @@ TUPLE: cs-loc n ; ! A pseudo-register class for parameters spilled on the stack TUPLE: stack-params ; +GENERIC: v>operand + +M: integer v>operand tag-bits shift ; + +M: f v>operand address ; + ! A virtual operation TUPLE: vop inputs outputs label ; : 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 ( 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 -- ? ) M: vop basic-block? drop f ; @@ -77,6 +89,12 @@ M: vop stack-reserve drop 0 ; : 2-vop ( in dest) [ 2array ] keep 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 TUPLE: %prologue ; C: %prologue make-vop ; @@ -179,11 +197,6 @@ C: %immediate make-vop ; 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 TUPLE: %indirect ; C: %indirect make-vop ; @@ -334,12 +347,6 @@ C: %tag make-vop ; : %tag ( vreg ) dest-vop <%tag> ; 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 ; C: %getenv make-vop ; : %getenv swap src/dest-vop <%getenv> ; diff --git a/library/compiler/x86/assembler.factor b/library/compiler/x86/assembler.factor index 6d3cdfccf5..19cbe95fac 100644 --- a/library/compiler/x86/assembler.factor +++ b/library/compiler/x86/assembler.factor @@ -47,25 +47,6 @@ REGISTER: EBP 5 32 REGISTER: ESI 6 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: register register-32 "register-size" word-prop 32 = ; diff --git a/library/compiler/x86/generator.factor b/library/compiler/x86/generator.factor index 5e893e0ccd..a02f90a5ba 100644 --- a/library/compiler/x86/generator.factor +++ b/library/compiler/x86/generator.factor @@ -13,22 +13,26 @@ M: %prologue generate-node drop ; : compile-c-call ( symbol dll -- ) [ CALL ] compile-dlsym ; M: %call generate-node ( vop -- ) - vop-label dup postpone-word CALL ; + drop label dup postpone-word CALL ; M: %call-label generate-node ( vop -- ) - vop-label CALL ; + drop label CALL ; M: %jump generate-node ( vop -- ) - vop-label dup postpone-word JMP ; + drop label dup postpone-word JMP ; M: %jump-label generate-node ( vop -- ) - vop-label JMP ; + drop label JMP ; 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 -- ) - 0 PUSH vop-label absolute ; + drop 0 PUSH label absolute-4 ; M: %return generate-node ( vop -- ) drop RET ; @@ -37,34 +41,35 @@ M: %dispatch generate-node ( vop -- ) #! Compile a piece of code that jumps to an offset in a #! jump table indexed by the fixnum at the top of the stack. #! The jump table must immediately follow this macro. - 0 vop-in v>operand +