]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.value-numbering: don't use complex addressing modes unless architecture...
authorSlava Pestov <slava@factorcode.org>
Tue, 4 May 2010 10:46:21 +0000 (05:46 -0500)
committerSlava Pestov <slava@factorcode.org>
Tue, 4 May 2010 10:46:21 +0000 (05:46 -0500)
basis/compiler/cfg/value-numbering/alien/alien.factor
basis/compiler/cfg/value-numbering/value-numbering-tests.factor

index 190d911ad58922b4a74c3750897d8c05a212d522..58674602d969267349eb0c3ed282588c5a4bc5fa 100644 (file)
@@ -70,7 +70,10 @@ M: ##unbox-alien rewrite rewrite-unbox-any-c-ptr ;
 ! construct a new ##load-memory or ##store-memory with the
 ! ##add's operand as the displacement
 : fuse-displacement? ( insn -- ? )
-    base>> vreg>insn ##add? ;
+    {
+        [ offset>> 0 = complex-addressing? or ]
+        [ base>> vreg>insn ##add? ]
+    } 1&& ;
 
 GENERIC: alien-insn-value ( insn -- value )
 
@@ -106,12 +109,14 @@ M: ##store-memory-imm new-alien-insn drop \ ##store-memory new-insn ;
     [ >>displacement ] [ >>scale ] bi* ;
 
 : rewrite-memory-op ( insn -- insn/f )
-    {
-        { [ dup fuse-base-offset? ] [ fuse-base-offset ] }
-        { [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] }
-        { [ dup fuse-scale? ] [ fuse-scale ] }
-        [ drop f ]
-    } cond ;
+    complex-addressing? [
+        {
+            { [ dup fuse-base-offset? ] [ fuse-base-offset ] }
+            { [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] }
+            { [ dup fuse-scale? ] [ fuse-scale ] }
+            [ drop f ]
+        } cond
+    ] [ drop f ] if ;
 
 : rewrite-memory-imm-op ( insn -- insn/f )
     {
index 3be4e584fbc1148194e6765862898de263185045..00d8652279c4d9f401c1cf6a2055f7a2113b367c 100644 (file)
@@ -2576,7 +2576,8 @@ cpu x86? [
     } value-numbering-step
 ] unit-test
 
-! Base offset fusion on ##load/store-memory
+! Base offset fusion on ##load/store-memory -- only on x86
+cpu x86?
 [
     V{
         T{ ##peek f 0 D 0 }
@@ -2586,7 +2587,18 @@ cpu x86? [
         T{ ##add-imm f 4 2 31337 }
         T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar }
     }
-] [
+]
+[
+    V{
+        T{ ##peek f 0 D 0 }
+        T{ ##peek f 1 D 1 }
+        T{ ##tagged>integer f 2 0 }
+        T{ ##tagged>integer f 3 1 }
+        T{ ##add-imm f 4 2 31337 }
+        T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
+    }
+] ?
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
@@ -2597,7 +2609,8 @@ cpu x86? [
     } value-numbering-step
 ] unit-test
 
-! Displacement offset fusion on ##load/store-memory
+! Displacement offset fusion on ##load/store-memory -- only on x86
+cpu x86?
 [
     V{
         T{ ##peek f 0 D 0 }
@@ -2607,7 +2620,18 @@ cpu x86? [
         T{ ##add-imm f 4 3 31337 }
         T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar }
     }
-] [
+]
+[
+    V{
+        T{ ##peek f 0 D 0 }
+        T{ ##peek f 1 D 1 }
+        T{ ##tagged>integer f 2 0 }
+        T{ ##tagged>integer f 3 1 }
+        T{ ##add-imm f 4 3 31337 }
+        T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
+    }
+] ?
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
@@ -2632,6 +2656,7 @@ cpu x86? [
 ] unit-test
 
 ! Scale fusion on ##load/store-memory
+cpu x86?
 [
     V{
         T{ ##peek f 0 D 0 }
@@ -2641,7 +2666,8 @@ cpu x86? [
         T{ ##shl-imm f 4 3 2 }
         T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar }
     }
-] [
+]
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
@@ -2649,29 +2675,41 @@ cpu x86? [
         T{ ##tagged>integer f 3 1 }
         T{ ##shl-imm f 4 3 2 }
         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
-    } value-numbering-step
-] unit-test
-
-! Don't do scale fusion if there's already a scale
-[ ] [
+    }
+] ?
+[
     V{
         T{ ##peek f 0 D 0 }
         T{ ##peek f 1 D 1 }
         T{ ##tagged>integer f 2 0 }
         T{ ##tagged>integer f 3 1 }
         T{ ##shl-imm f 4 3 2 }
-        T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
-    } dup value-numbering-step assert=
-] unit-test
-
-! Don't do scale fusion if the scale factor is out of range
-[ ] [
-    V{
-        T{ ##peek f 0 D 0 }
-        T{ ##peek f 1 D 1 }
-        T{ ##tagged>integer f 2 0 }
-        T{ ##tagged>integer f 3 1 }
-        T{ ##shl-imm f 4 3 4 }
         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
-    } dup value-numbering-step assert=
+    } value-numbering-step
 ] unit-test
+
+cpu x86? [
+    ! Don't do scale fusion if there's already a scale
+    [ ] [
+        V{
+            T{ ##peek f 0 D 0 }
+            T{ ##peek f 1 D 1 }
+            T{ ##tagged>integer f 2 0 }
+            T{ ##tagged>integer f 3 1 }
+            T{ ##shl-imm f 4 3 2 }
+            T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
+        } dup value-numbering-step assert=
+    ] unit-test
+
+    ! Don't do scale fusion if the scale factor is out of range
+    [ ] [
+        V{
+            T{ ##peek f 0 D 0 }
+            T{ ##peek f 1 D 1 }
+            T{ ##tagged>integer f 2 0 }
+            T{ ##tagged>integer f 3 1 }
+            T{ ##shl-imm f 4 3 4 }
+            T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
+        } dup value-numbering-step assert=
+    ] unit-test
+] when