]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.value-numbering: constant folding for ##shuffle-vector
authorSlava Pestov <slava@factorcode.org>
Tue, 18 May 2010 08:22:21 +0000 (04:22 -0400)
committerSlava Pestov <slava@factorcode.org>
Tue, 18 May 2010 08:22:21 +0000 (04:22 -0400)
basis/compiler/cfg/value-numbering/simd/simd.factor
basis/compiler/cfg/value-numbering/value-numbering-tests.factor

index 1ef18c54c5b14b53127f469b3c67d672e6f9b269..84acc95859b76cc21452162a2f47588a6b09ab40 100644 (file)
@@ -99,6 +99,17 @@ M: ##gather-vector-4 rewrite rewrite-gather-vector-4 ;
 
 M: ##gather-int-vector-4 rewrite rewrite-gather-vector-4 ;
 
+: fold-shuffle-vector ( insn src1 src2 -- insn )
+    [ dst>> ] [ obj>> ] [ obj>> ] tri*
+    swap nths \ ##load-reference new-insn ;
+
+M: ##shuffle-vector rewrite
+    dup [ src>> vreg>insn ] [ shuffle>> vreg>insn ] bi
+    {
+        { [ 2dup [ ##load-reference? ] both? ] [ fold-shuffle-vector ] }
+        [ 3drop f ]
+    } cond ;
+
 M: ##xor-vector rewrite
     dup diagonal?
     [ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ;
index 77a180c2bd0edade5d9ac726be09ecaa2a726777..015368cf98ba4aa435cfa80996b719a53666f266 100644 (file)
@@ -2348,6 +2348,22 @@ cell 8 = [
     } value-numbering-step
 ] unit-test
 
+[
+    {
+        T{ ##load-integer f 0 55 }
+        T{ ##load-reference f 1 B{ 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 } }
+        T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
+        T{ ##load-reference f 3 B{ 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 } }
+    }
+] [
+    {
+        T{ ##load-integer f 0 55 }
+        T{ ##scalar>vector f 1 0 short-8-rep }
+        T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
+        T{ ##shuffle-vector f 3 1 2 float-4-rep }
+    } value-numbering-step
+] unit-test
+
 [
     {
         T{ ##load-reference f 0 1.25 }