diff --git a/basis/compiler/cfg/value-numbering/simd/simd.factor b/basis/compiler/cfg/value-numbering/simd/simd.factor index 1ef18c54c5..84acc95859 100644 --- a/basis/compiler/cfg/value-numbering/simd/simd.factor +++ b/basis/compiler/cfg/value-numbering/simd/simd.factor @@ -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 ; diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index 77a180c2bd..015368cf98 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -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 }