diff --git a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor index bc228cb3b4..28c6741bc1 100755 --- a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor +++ b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor @@ -515,3 +515,48 @@ M: ##scalar>vector rewrite M: ##xor-vector rewrite dup [ src1>> vreg>vn ] [ src2>> vreg>vn ] bi eq? [ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ; + +: vector-not? ( expr -- ? ) + { + [ not-vector-expr? ] + [ { + [ xor-vector-expr? ] + [ [ src1>> ] [ src2>> ] bi [ vn>expr fill-vector-expr? ] either? ] + } 1&& ] + } 1|| ; + +GENERIC: vector-not-src ( expr -- vreg ) +M: not-vector-expr vector-not-src src>> vn>vreg ; +M: xor-vector-expr vector-not-src + dup src1>> vn>expr fill-vector-expr? [ src2>> ] [ src1>> ] if vn>vreg ; + +M: ##and-vector rewrite + { + { [ dup src1>> vreg>expr vector-not? ] [ + { + [ dst>> ] + [ src1>> vreg>expr vector-not-src ] + [ src2>> ] + [ rep>> ] + } cleave \ ##andn-vector new-insn + ] } + { [ dup src2>> vreg>expr vector-not? ] [ + { + [ dst>> ] + [ src2>> vreg>expr vector-not-src ] + [ src1>> ] + [ rep>> ] + } cleave \ ##andn-vector new-insn + ] } + [ drop f ] + } cond ; + +M: ##andn-vector rewrite + dup src1>> vreg>expr vector-not? [ + { + [ dst>> ] + [ src1>> vreg>expr vector-not-src ] + [ src2>> ] + [ rep>> ] + } cleave \ ##and-vector new-insn + ] [ drop f ] if ; diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index 733b8cc22a..55ff39e9d2 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -1281,6 +1281,128 @@ cell 8 = [ } value-numbering-step ] unit-test +! NOT x AND y => x ANDN y + +[ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##andn-vector f 5 0 1 float-4-rep } + } +] [ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##and-vector f 5 4 1 float-4-rep } + } value-numbering-step +] unit-test + +[ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##andn-vector f 5 0 1 float-4-rep } + } +] [ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##and-vector f 5 4 1 float-4-rep } + } value-numbering-step +] unit-test + +! x AND NOT y => y ANDN x + +[ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##andn-vector f 5 0 1 float-4-rep } + } +] [ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##and-vector f 5 1 4 float-4-rep } + } value-numbering-step +] unit-test + +[ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##andn-vector f 5 0 1 float-4-rep } + } +] [ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##and-vector f 5 1 4 float-4-rep } + } value-numbering-step +] unit-test + +! NOT x ANDN y => x AND y + +[ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##and-vector f 5 0 1 float-4-rep } + } +] [ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##andn-vector f 5 4 1 float-4-rep } + } value-numbering-step +] unit-test + +[ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##and-vector f 5 0 1 float-4-rep } + } +] [ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##andn-vector f 5 4 1 float-4-rep } + } value-numbering-step +] unit-test + +! AND <=> ANDN + +[ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##andn-vector f 5 0 1 float-4-rep } + T{ ##and-vector f 6 0 2 float-4-rep } + T{ ##or-vector f 7 5 6 float-4-rep } + } +] [ + { + T{ ##fill-vector f 3 float-4-rep } + T{ ##xor-vector f 4 0 3 float-4-rep } + T{ ##and-vector f 5 4 1 float-4-rep } + T{ ##andn-vector f 6 4 2 float-4-rep } + T{ ##or-vector f 7 5 6 float-4-rep } + } value-numbering-step +] unit-test + +[ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##andn-vector f 5 0 1 float-4-rep } + T{ ##and-vector f 6 0 2 float-4-rep } + T{ ##or-vector f 7 5 6 float-4-rep } + } +] [ + { + T{ ##not-vector f 4 0 float-4-rep } + T{ ##and-vector f 5 4 1 float-4-rep } + T{ ##andn-vector f 6 4 2 float-4-rep } + T{ ##or-vector f 7 5 6 float-4-rep } + } value-numbering-step +] unit-test + +! branch folding + : test-branch-folding ( insns -- insns' n ) [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep