From e323071c44d263edc9710ce44da5c3588ebfe9f1 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Wed, 11 Nov 2009 16:08:40 -0600 Subject: [PATCH] sever lingering dependencies on simd from compiler --- .../compiler/cfg/intrinsics/intrinsics.factor | 2 - .../value-numbering/rewrite/rewrite.factor | 93 +------------- .../cfg/value-numbering/simd/simd.factor | 120 ++++++++++++++++++ .../value-numbering/simplify/simplify.factor | 12 +- .../value-numbering-tests.factor | 2 +- .../math/vectors/simd/mirrors/mirrors.factor | 3 + basis/math/vectors/simd/simd.factor | 7 +- basis/math/vectors/vectors.factor | 3 +- .../specialized-arrays/mirrors/mirrors.factor | 2 - .../specialized-arrays.factor | 9 +- 10 files changed, 135 insertions(+), 118 deletions(-) create mode 100644 basis/compiler/cfg/value-numbering/simd/simd.factor create mode 100644 basis/math/vectors/simd/mirrors/mirrors.factor diff --git a/basis/compiler/cfg/intrinsics/intrinsics.factor b/basis/compiler/cfg/intrinsics/intrinsics.factor index 632c32b12f..f4bbcdb255 100644 --- a/basis/compiler/cfg/intrinsics/intrinsics.factor +++ b/basis/compiler/cfg/intrinsics/intrinsics.factor @@ -7,7 +7,6 @@ compiler.cfg.intrinsics.alien compiler.cfg.intrinsics.allot compiler.cfg.intrinsics.fixnum compiler.cfg.intrinsics.float -compiler.cfg.intrinsics.simd compiler.cfg.intrinsics.slots compiler.cfg.intrinsics.misc compiler.cfg.comparisons ; @@ -23,7 +22,6 @@ QUALIFIED: classes.tuple.private QUALIFIED: math.private QUALIFIED: math.integers.private QUALIFIED: math.floats.private -QUALIFIED: math.vectors.simd.intrinsics QUALIFIED: math.libm IN: compiler.cfg.intrinsics diff --git a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor index 4864a8bfb7..746fe0e5ea 100755 --- a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor +++ b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor @@ -2,7 +2,7 @@ ! 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 math.vectors.simd.intrinsics classes +math.bitwise math.order classes vectors locals make alien.c-types io.binary grouping compiler.cfg compiler.cfg.registers @@ -463,100 +463,9 @@ M: ##alien-signed-2 rewrite rewrite-alien-addressing ; M: ##alien-signed-4 rewrite rewrite-alien-addressing ; M: ##alien-float rewrite rewrite-alien-addressing ; M: ##alien-double rewrite rewrite-alien-addressing ; -M: ##alien-vector rewrite rewrite-alien-addressing ; M: ##set-alien-integer-1 rewrite rewrite-alien-addressing ; M: ##set-alien-integer-2 rewrite rewrite-alien-addressing ; M: ##set-alien-integer-4 rewrite rewrite-alien-addressing ; M: ##set-alien-float rewrite rewrite-alien-addressing ; M: ##set-alien-double rewrite rewrite-alien-addressing ; -M: ##set-alien-vector rewrite rewrite-alien-addressing ; -! Some lame constant folding for SIMD intrinsics. Eventually this -! should be redone completely. - -: rewrite-shuffle-vector-imm ( insn expr -- insn' ) - 2dup [ rep>> ] bi@ eq? [ - [ [ dst>> ] [ src>> vn>vreg ] bi* ] - [ [ shuffle>> ] bi@ nths ] - [ drop rep>> ] - 2tri \ ##shuffle-vector-imm new-insn - ] [ 2drop f ] if ; - -: (fold-shuffle-vector-imm) ( shuffle bytes -- bytes' ) - 2dup length swap length /i group nths concat ; - -: fold-shuffle-vector-imm ( insn expr -- insn' ) - [ [ dst>> ] [ shuffle>> ] bi ] dip value>> - (fold-shuffle-vector-imm) \ ##load-constant new-insn ; - -M: ##shuffle-vector-imm rewrite - dup src>> vreg>expr { - { [ dup shuffle-vector-imm-expr? ] [ rewrite-shuffle-vector-imm ] } - { [ dup reference-expr? ] [ fold-shuffle-vector-imm ] } - { [ dup constant-expr? ] [ fold-shuffle-vector-imm ] } - [ 2drop f ] - } cond ; - -: (fold-scalar>vector) ( insn bytes -- insn' ) - [ [ dst>> ] [ rep>> rep-components ] bi ] dip concat - \ ##load-constant new-insn ; - -: fold-scalar>vector ( insn expr -- insn' ) - value>> over rep>> { - { float-4-rep [ float>bits 4 >le (fold-scalar>vector) ] } - { double-2-rep [ double>bits 8 >le (fold-scalar>vector) ] } - [ [ untag-fixnum ] dip rep-component-type heap-size >le (fold-scalar>vector) ] - } case ; - -M: ##scalar>vector rewrite - dup src>> vreg>expr dup constant-expr? - [ fold-scalar>vector ] [ 2drop f ] if ; - -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 ; diff --git a/basis/compiler/cfg/value-numbering/simd/simd.factor b/basis/compiler/cfg/value-numbering/simd/simd.factor new file mode 100644 index 0000000000..9bb4453313 --- /dev/null +++ b/basis/compiler/cfg/value-numbering/simd/simd.factor @@ -0,0 +1,120 @@ +! Copyright (C) 2008, 2009 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 +vectors locals make alien.c-types io.binary grouping +math.vectors.simd +compiler.cfg +compiler.cfg.registers +compiler.cfg.comparisons +compiler.cfg.instructions +compiler.cfg.value-numbering.expressions +compiler.cfg.value-numbering.graph +compiler.cfg.value-numbering.rewrite +compiler.cfg.value-numbering.simplify ; +IN: compiler.cfg.value-numbering.simd + +M: ##alien-vector rewrite rewrite-alien-addressing ; +M: ##set-alien-vector rewrite rewrite-alien-addressing ; + +! Some lame constant folding for SIMD intrinsics. Eventually this +! should be redone completely. + +: rewrite-shuffle-vector-imm ( insn expr -- insn' ) + 2dup [ rep>> ] bi@ eq? [ + [ [ dst>> ] [ src>> vn>vreg ] bi* ] + [ [ shuffle>> ] bi@ nths ] + [ drop rep>> ] + 2tri \ ##shuffle-vector-imm new-insn + ] [ 2drop f ] if ; + +: (fold-shuffle-vector-imm) ( shuffle bytes -- bytes' ) + 2dup length swap length /i group nths concat ; + +: fold-shuffle-vector-imm ( insn expr -- insn' ) + [ [ dst>> ] [ shuffle>> ] bi ] dip value>> + (fold-shuffle-vector-imm) \ ##load-constant new-insn ; + +M: ##shuffle-vector-imm rewrite + dup src>> vreg>expr { + { [ dup shuffle-vector-imm-expr? ] [ rewrite-shuffle-vector-imm ] } + { [ dup reference-expr? ] [ fold-shuffle-vector-imm ] } + { [ dup constant-expr? ] [ fold-shuffle-vector-imm ] } + [ 2drop f ] + } cond ; + +: (fold-scalar>vector) ( insn bytes -- insn' ) + [ [ dst>> ] [ rep>> rep-length ] bi ] dip concat + \ ##load-constant new-insn ; + +: fold-scalar>vector ( insn expr -- insn' ) + value>> over rep>> { + { float-4-rep [ float>bits 4 >le (fold-scalar>vector) ] } + { double-2-rep [ double>bits 8 >le (fold-scalar>vector) ] } + [ [ untag-fixnum ] dip rep-component-type heap-size >le (fold-scalar>vector) ] + } case ; + +M: ##scalar>vector rewrite + dup src>> vreg>expr dup constant-expr? + [ fold-scalar>vector ] [ 2drop f ] if ; + +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 ; + +M: scalar>vector-expr simplify* + src>> vn>expr { + { [ dup vector>scalar-expr? ] [ src>> ] } + [ drop f ] + } cond ; + +M: shuffle-vector-imm-expr simplify* + [ src>> ] [ shuffle>> ] [ rep>> rep-length iota ] tri + sequence= [ drop f ] unless ; + diff --git a/basis/compiler/cfg/value-numbering/simplify/simplify.factor b/basis/compiler/cfg/value-numbering/simplify/simplify.factor index df3dc6aab9..7a95711b01 100644 --- a/basis/compiler/cfg/value-numbering/simplify/simplify.factor +++ b/basis/compiler/cfg/value-numbering/simplify/simplify.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors combinators classes math layouts -sequences math.vectors.simd.intrinsics +sequences compiler.cfg.instructions compiler.cfg.value-numbering.graph compiler.cfg.value-numbering.expressions ; @@ -130,16 +130,6 @@ M: box-displaced-alien-expr simplify* [ 2drop f ] } cond ; -M: scalar>vector-expr simplify* - src>> vn>expr { - { [ dup vector>scalar-expr? ] [ src>> ] } - [ drop f ] - } cond ; - -M: shuffle-vector-imm-expr simplify* - [ src>> ] [ shuffle>> ] [ rep>> rep-components iota ] tri - sequence= [ drop f ] unless ; - M: expr simplify* drop f ; : simplify ( expr -- vn ) diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index b404c4d4a4..ac992ff98d 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -4,7 +4,7 @@ cpu.architecture tools.test kernel math combinators.short-circuit accessors sequences compiler.cfg.predecessors locals compiler.cfg.dce compiler.cfg.ssa.destruction compiler.cfg.loop-detection compiler.cfg.representations compiler.cfg assocs vectors arrays -layouts literals namespaces alien ; +layouts literals namespaces alien compiler.cfg.value-numbering.simd ; IN: compiler.cfg.value-numbering.tests : trim-temps ( insns -- insns ) diff --git a/basis/math/vectors/simd/mirrors/mirrors.factor b/basis/math/vectors/simd/mirrors/mirrors.factor new file mode 100644 index 0000000000..e8a103d449 --- /dev/null +++ b/basis/math/vectors/simd/mirrors/mirrors.factor @@ -0,0 +1,3 @@ +USING: math.vectors.simd mirrors ; +IN: math.vectors.simd.mirrors +INSTANCE: simd-128 enumerated-sequence diff --git a/basis/math/vectors/simd/simd.factor b/basis/math/vectors/simd/simd.factor index c155c797ff..4953abb4ea 100644 --- a/basis/math/vectors/simd/simd.factor +++ b/basis/math/vectors/simd/simd.factor @@ -320,7 +320,7 @@ M: simd-128 n+v [ simd-with ] keep v+ ; inline M: simd-128 n-v [ simd-with ] keep v- ; inline M: simd-128 n*v [ simd-with ] keep v* ; inline M: simd-128 n/v [ simd-with ] keep v/ ; inline -M: simd-128 v+n over simd-with v+ +M: simd-128 v+n over simd-with v+ ; inline M: simd-128 v-n over simd-with v- ; inline M: simd-128 v*n over simd-with v* ; inline M: simd-128 v/n over simd-with v/ ; inline @@ -336,3 +336,8 @@ M: simd-128 vshuffle ( u perm -- v ) "compiler.tree.propagation.simd" require "compiler.cfg.intrinsics.simd" require +"compiler.cfg.value-numbering.simd" require + +"mirrors" vocab [ + "math.vectors.simd.mirrors" require +] when diff --git a/basis/math/vectors/vectors.factor b/basis/math/vectors/vectors.factor index f3dfcda18a..d524ba309f 100644 --- a/basis/math/vectors/vectors.factor +++ b/basis/math/vectors/vectors.factor @@ -97,7 +97,7 @@ M: object vbitor [ bitor ] 2map ; GENERIC: vbitxor ( u v -- w ) M: object vbitxor [ bitxor ] 2map ; GENERIC: vbitnot ( u -- w ) -M: object vbitnot [ bitnot ] 2map ; +M: object vbitnot [ bitnot ] map ; GENERIC# vbroadcast 1 ( u n -- v ) M:: object vbroadcast ( u n -- v ) u length n u nth u like ; @@ -133,6 +133,7 @@ GENERIC: (vmerge-tail) ( u v -- t ) M: object (vmerge-tail) over length 2 /i '[ _ tail-slice ] bi@ [ zip ] keep concat-as ; GENERIC: (vmerge) ( u v -- h t ) +M: object (vmerge) [ (vmerge-head) ] [ (vmerge-tail) ] 2bi ; inline GENERIC: vmerge ( u v -- w ) diff --git a/basis/specialized-arrays/mirrors/mirrors.factor b/basis/specialized-arrays/mirrors/mirrors.factor index ee7953b501..eea9e83b58 100644 --- a/basis/specialized-arrays/mirrors/mirrors.factor +++ b/basis/specialized-arrays/mirrors/mirrors.factor @@ -4,5 +4,3 @@ USING: mirrors specialized-arrays math.vectors ; IN: specialized-arrays.mirrors INSTANCE: specialized-array enumerated-sequence -INSTANCE: simd-128 enumerated-sequence -INSTANCE: simd-256 enumerated-sequence diff --git a/basis/specialized-arrays/specialized-arrays.factor b/basis/specialized-arrays/specialized-arrays.factor index 711354d803..b6f7209cc6 100755 --- a/basis/specialized-arrays/specialized-arrays.factor +++ b/basis/specialized-arrays/specialized-arrays.factor @@ -2,8 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien alien.c-types alien.data alien.parser assocs byte-arrays classes compiler.units functors kernel lexer -libc math math.vectors math.vectors.private -math.vectors.specialization namespaces +libc math math.vectors math.vectors.private namespaces parser prettyprint.custom sequences sequences.private strings summary vocabs vocabs.loader vocabs.parser vocabs.generated words fry combinators make ; @@ -69,8 +68,6 @@ TUPLE: A [ drop \ T bad-byte-array-length ] unless ; inline -M: A new-underlying drop byte-array>A ; - M: A clone [ underlying>> clone ] [ length>> ] bi ; inline M: A length length>> ; inline @@ -96,8 +93,6 @@ M: A resize M: A byte-length length \ T heap-size * ; inline -M: A element-type drop \ T ; inline - M: A direct-array-syntax drop \ A@ ; M: A pprint-delims drop \ A{ \ } ; @@ -109,8 +104,6 @@ SYNTAX: A@ scan-object scan-object suffix! ; INSTANCE: A specialized-array -A T c-type-boxed-class f specialize-vector-words - ;FUNCTOR GENERIC: (underlying-type) ( c-type -- c-type' )