value numbering rewrite rules for vector ops to convert "not and" to "andn" and "not andn" to "and"
parent
34344be636
commit
764e085004
|
@ -515,3 +515,48 @@ M: ##scalar>vector rewrite
|
||||||
M: ##xor-vector rewrite
|
M: ##xor-vector rewrite
|
||||||
dup [ src1>> vreg>vn ] [ src2>> vreg>vn ] bi eq?
|
dup [ src1>> vreg>vn ] [ src2>> vreg>vn ] bi eq?
|
||||||
[ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ;
|
[ [ 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 ;
|
||||||
|
|
|
@ -1281,6 +1281,128 @@ cell 8 = [
|
||||||
} value-numbering-step
|
} value-numbering-step
|
||||||
] unit-test
|
] 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 )
|
: test-branch-folding ( insns -- insns' n )
|
||||||
<basic-block>
|
<basic-block>
|
||||||
[ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
|
[ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
|
||||||
|
|
Loading…
Reference in New Issue