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
|
||||
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 ;
|
||||
|
|
|
@ -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 )
|
||||
<basic-block>
|
||||
[ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
|
||||
|
|
Loading…
Reference in New Issue