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 ;
} 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 }