! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators combinators.short-circuit arrays
-fry kernel layouts math namespaces sequences cpu.architecture
-math.bitwise math.order classes generalizations
-combinators.smart locals make alien.c-types io.binary grouping
-math.vectors.simd.intrinsics
-compiler.cfg
-compiler.cfg.registers
-compiler.cfg.utilities
-compiler.cfg.comparisons
-compiler.cfg.instructions
+USING: accessors alien.c-types combinators
+combinators.short-circuit compiler.cfg.instructions
+compiler.cfg.utilities compiler.cfg.value-numbering.graph
compiler.cfg.value-numbering.math
-compiler.cfg.value-numbering.graph
-compiler.cfg.value-numbering.rewrite ;
+compiler.cfg.value-numbering.rewrite cpu.architecture
+endian generalizations grouping kernel make math sequences ;
IN: compiler.cfg.value-numbering.simd
! Some lame constant folding for SIMD intrinsics. Eventually this
! should be redone completely.
: useless-shuffle-vector-imm? ( insn -- ? )
- [ shuffle>> ] [ rep>> rep-length iota ] bi sequence= ;
+ [ shuffle>> ] [ rep>> rep-length <iota> ] bi sequence= ;
: compose-shuffle-vector-imm ( outer inner -- insn' )
2dup [ rep>> ] bi@ eq? [
[ [ dst>> ] [ src>> ] bi* ]
[ [ shuffle>> ] bi@ nths ]
[ drop rep>> ]
- 2tri \ ##shuffle-vector-imm new-insn
+ 2tri ##shuffle-vector-imm new-insn
] [ 2drop f ] if ;
: (fold-shuffle-vector-imm) ( shuffle bytes -- bytes' )
: fold-shuffle-vector-imm ( outer inner -- insn' )
[ [ dst>> ] [ shuffle>> ] bi ] [ obj>> ] bi*
- (fold-shuffle-vector-imm) \ ##load-reference new-insn ;
+ (fold-shuffle-vector-imm) ##load-reference new-insn ;
M: ##shuffle-vector-imm rewrite
dup src>> vreg>insn {
: (fold-scalar>vector) ( insn bytes -- insn' )
[ [ dst>> ] [ rep>> rep-length ] bi ] dip <repetition> concat
- \ ##load-reference new-insn ;
+ ##load-reference new-insn ;
: fold-scalar>vector ( outer inner -- insn' )
over rep>> scalar-value (fold-scalar>vector) ;
:: fold-gather-vector-2 ( insn src1 src2 -- insn )
insn dst>>
src1 src2 [ insn rep>> scalar-value ] bi@ append
- \ ##load-reference new-insn ;
+ ##load-reference new-insn ;
: rewrite-gather-vector-2 ( insn -- insn/f )
dup [ src1>> vreg>insn ] [ src2>> vreg>insn ] bi {
insn dst>>
[
src1 src2 src3 src4
- [ insn rep>> scalar-value ] 4 napply
- ] B{ } append-outputs-as
- \ ##load-reference new-insn ;
+ [ insn rep>> scalar-value % ] 4 napply
+ ] B{ } make
+ ##load-reference new-insn ;
: rewrite-gather-vector-4 ( insn -- insn/f )
dup { [ src1>> ] [ src2>> ] [ src3>> ] [ src4>> ] } cleave [ vreg>insn ] 4 napply
{
- { [ 4 ndup [ literal-insn? ] 4 napply and and and ] [ fold-gather-vector-4 ] }
- [ 5 ndrop f ]
+ { [ 4dup [ literal-insn? ] 4 napply and and and ] [ fold-gather-vector-4 ] }
+ [ 5drop f ]
} cond ;
M: ##gather-vector-4 rewrite rewrite-gather-vector-4 ;
: fold-shuffle-vector ( insn src1 src2 -- insn )
[ dst>> ] [ obj>> ] [ obj>> ] tri*
- swap nths \ ##load-reference new-insn ;
+ swap nths ##load-reference new-insn ;
M: ##shuffle-vector rewrite
dup [ src>> vreg>insn ] [ shuffle>> vreg>insn ] bi
M: ##xor-vector rewrite
dup diagonal?
- [ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ;
+ [ [ dst>> ] [ rep>> ] bi ##zero-vector new-insn ] [ drop f ] if ;
: vector-not? ( insn -- ? )
{
M: ##xor-vector vector-not-src
dup src1>> vreg>insn ##fill-vector? [ src2>> ] [ src1>> ] if ;
-M: ##and-vector rewrite
+M: ##and-vector rewrite
{
{ [ dup src1>> vreg>insn vector-not? ] [
{
[ src1>> vreg>insn vector-not-src ]
[ src2>> ]
[ rep>> ]
- } cleave \ ##andn-vector new-insn
+ } cleave ##andn-vector new-insn
] }
{ [ dup src2>> vreg>insn vector-not? ] [
{
[ src2>> vreg>insn vector-not-src ]
[ src1>> ]
[ rep>> ]
- } cleave \ ##andn-vector new-insn
+ } cleave ##andn-vector new-insn
] }
[ drop f ]
} cond ;
[ src1>> vreg>insn vector-not-src ]
[ src2>> ]
[ rep>> ]
- } cleave \ ##and-vector new-insn
+ } cleave ##and-vector new-insn
] [ drop f ] if ;