]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.*: new cfg instruction ##clear, it makes it easier to see where 1321/head
authorBjörn Lindqvist <bjourne@gmail.com>
Sun, 17 May 2015 05:57:24 +0000 (07:57 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Sun, 17 May 2015 05:59:34 +0000 (07:59 +0200)
the compiler.cfg.stacks.clearing pass inserts extra instructions

basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/stacks/clearing/clearing-tests.factor
basis/compiler/cfg/stacks/clearing/clearing.factor
basis/compiler/codegen/codegen.factor
basis/cpu/architecture/architecture.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/x86.factor

index 4b9ce2c3682a0996fa1561d4645cfae548137fe3..703294e394c2d9bc7e74e60e59ce7c9d1c5eec38 100644 (file)
@@ -57,6 +57,9 @@ literal: loc ;
 INSN: ##replace-imm
 literal: src loc ;
 
+INSN: ##clear
+literal: loc ;
+
 INSN: ##inc
 literal: loc ;
 
index d1737bdd927c4e47599fc8bf1a69768d64cabe36..c065ce3a70a3fc2ce447b4c06207f5d738c64436 100644 (file)
@@ -7,8 +7,8 @@ IN: compiler.cfg.stacks.clearing.tests
 {
     V{
         T{ ##inc { loc D 2 } { insn# 0 } }
-        T{ ##replace-imm { src 297 } { loc T{ ds-loc { n 1 } } } }
-        T{ ##replace-imm { src 297 } { loc T{ ds-loc } } }
+        T{ ##clear { loc T{ ds-loc { n 1 } } } }
+        T{ ##clear { loc T{ ds-loc } } }
         T{ ##peek { loc D 2 } { insn# 1 } }
     }
 } [
index 128302fba2410be974b91a847e794607cf9c9760..86ff38a54965023a9a5ce9bc507b91b4dcf3a98c 100644 (file)
@@ -3,22 +3,20 @@ compiler.cfg.instructions compiler.cfg.registers compiler.cfg.rpo
 compiler.cfg.stacks compiler.cfg.stacks.padding kernel math sequences ;
 IN: compiler.cfg.stacks.clearing
 
-! This step maybe is redundant.
-
-: state>replaces ( state -- replaces )
+: state>clears ( state -- clears )
     [ second ] map { ds-loc rs-loc } [ swap create-locs ] 2map concat
-    [ 297 swap f ##replace-imm boa ] map ;
+    [ f ##clear boa ] map ;
 
 : dangerous-insn? ( state insn -- ? )
     { [ nip ##peek? ] [ underflowable-peek? ] } 2&& ;
 
-: clearing-replaces ( assoc insn -- insns' )
+: clearing-insns ( assoc insn -- insns' )
     [ insn#>> of ] keep 2dup dangerous-insn? [
-        drop state>replaces
+        drop state>clears
     ] [ 2drop { } ] if ;
 
 : visit-insns ( assoc insns -- insns' )
-    [ [ clearing-replaces ] keep suffix ] with map V{ } concat-as ;
+    [ [ clearing-insns ] keep suffix ] with map V{ } concat-as ;
 
 : clear-uninitialized ( cfg -- )
     [ trace-stack-state2 ] keep [
index b7a14b7332454219068645e719a6d7a9d9d4db98..a488a36e7f630eb395c9c6f7369cddc48e7ac425 100755 (executable)
@@ -147,6 +147,7 @@ CODEGEN: ##load-vector %load-vector
 CODEGEN: ##peek %peek
 CODEGEN: ##replace %replace
 CODEGEN: ##replace-imm %replace-imm
+CODEGEN: ##clear %clear
 CODEGEN: ##inc %inc
 CODEGEN: ##call %call
 CODEGEN: ##jump %jump
index 43f4c50464444fe23442a6111f5874374515fb56..6cd42c5752afd7491eb81447b294f621906aefae 100644 (file)
@@ -231,6 +231,7 @@ HOOK: %load-vector cpu ( reg val rep -- )
 HOOK: %peek cpu ( vreg loc -- )
 HOOK: %replace cpu ( vreg loc -- )
 HOOK: %replace-imm cpu ( src loc -- )
+HOOK: %clear cpu ( loc -- )
 HOOK: %inc cpu ( loc -- )
 
 HOOK: stack-frame-size cpu ( stack-frame -- n )
index 5b126f0514e1310bb856a09f6dfceccf375f1578..d7ae849587587b1169f014097040d0165a44c09c 100644 (file)
@@ -184,6 +184,9 @@ M:: ppc %replace-imm ( src loc -- )
     } cond
     scratch-reg reg offset %store-cell ;
 
+M: ppc %clear ( loc -- )
+    297 swap %replace-imm ;
+
 ! Increment stack pointer by n cells.
 M: ppc %inc ( loc -- )
     [ ds-loc? [ ds-reg ds-reg ] [ rs-reg rs-reg ] if ] [ n>> ] bi cells ADDI ;
index d02a6078c749a99a79141d399a5ae12e7b6d476f..6cd5c7cd5b5b67b3bb116b2d274356f0e795bdb7 100644 (file)
@@ -90,6 +90,9 @@ M: x86 %replace-imm
         [ [ 0xffffffff MOV ] dip rc-absolute rel-literal ]
     } cond ;
 
+M: x86 %clear ( loc -- )
+    loc>operand 297 MOV ;
+
 : (%inc) ( n reg -- ) swap cells dup 0 > [ ADD ] [ neg SUB ] if ; inline
 
 M: x86 %inc ( loc -- )