diff --git a/basis/compiler/cfg/intrinsics/intrinsics.factor b/basis/compiler/cfg/intrinsics/intrinsics.factor index 739bcdb366..caa322fc46 100644 --- a/basis/compiler/cfg/intrinsics/intrinsics.factor +++ b/basis/compiler/cfg/intrinsics/intrinsics.factor @@ -23,9 +23,7 @@ QUALIFIED: classes.tuple.private QUALIFIED: math.private QUALIFIED: math.integers.private QUALIFIED: math.floats.private -QUALIFIED: math.vectors.simd -QUALIFIED: math.vectors.simd.private -QUALIFIED: math.vectors.simd.alien +QUALIFIED: math.vectors.simd.intrinsics QUALIFIED: math.libm IN: compiler.cfg.intrinsics @@ -148,24 +146,24 @@ IN: compiler.cfg.intrinsics : enable-sse2-simd ( -- ) { - { math.vectors.simd.private:assert-positive [ drop ] } - { math.vectors.simd.private:(simd-v+) [ [ ^^add-vector ] emit-binary-vector-op ] } - { math.vectors.simd.private:(simd-v-) [ [ ^^sub-vector ] emit-binary-vector-op ] } - { math.vectors.simd.private:(simd-v*) [ [ ^^mul-vector ] emit-binary-vector-op ] } - { math.vectors.simd.private:(simd-v/) [ [ ^^div-vector ] emit-binary-vector-op ] } - { math.vectors.simd.private:(simd-vmin) [ [ ^^min-vector ] emit-binary-vector-op ] } - { math.vectors.simd.private:(simd-vmax) [ [ ^^max-vector ] emit-binary-vector-op ] } - { math.vectors.simd.private:(simd-vsqrt) [ [ ^^sqrt-vector ] emit-binary-vector-op ] } - { math.vectors.simd.private:(simd-broadcast) [ [ ^^broadcast-vector ] emit-unary-vector-op ] } - { math.vectors.simd.private:(simd-gather-2) [ emit-gather-vector-2 ] } - { math.vectors.simd.private:(simd-gather-4) [ emit-gather-vector-4 ] } - { math.vectors.simd.alien:alien-vector [ emit-alien-vector ] } - { math.vectors.simd.alien:set-alien-vector [ emit-set-alien-vector ] } + { math.vectors.simd.intrinsics:assert-positive [ drop ] } + { math.vectors.simd.intrinsics:(simd-v+) [ [ ^^add-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-v-) [ [ ^^sub-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-v*) [ [ ^^mul-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-v/) [ [ ^^div-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-vmin) [ [ ^^min-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-vmax) [ [ ^^max-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-vsqrt) [ [ ^^sqrt-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-broadcast) [ [ ^^broadcast-vector ] emit-unary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-gather-2) [ emit-gather-vector-2 ] } + { math.vectors.simd.intrinsics:(simd-gather-4) [ emit-gather-vector-4 ] } + { math.vectors.simd.intrinsics:alien-vector [ emit-alien-vector ] } + { math.vectors.simd.intrinsics:set-alien-vector [ emit-set-alien-vector ] } } enable-intrinsics ; : enable-sse3-simd ( -- ) { - { math.vectors.simd.private:(simd-sum) [ [ ^^horizontal-add-vector ] emit-unary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-sum) [ [ ^^horizontal-add-vector ] emit-unary-vector-op ] } } enable-intrinsics ; : emit-intrinsic ( node word -- ) diff --git a/basis/compiler/tree/propagation/simd/simd.factor b/basis/compiler/tree/propagation/simd/simd.factor index 57c77538a9..9f63e747b9 100644 --- a/basis/compiler/tree/propagation/simd/simd.factor +++ b/basis/compiler/tree/propagation/simd/simd.factor @@ -2,8 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors byte-arrays combinators compiler.tree.propagation.info cpu.architecture kernel words math -math.intervals math.vectors.simd math.vectors.simd.private -math.vectors.simd.alien ; +math.intervals math.vectors.simd.intrinsics ; IN: compiler.tree.propagation.simd \ (simd-v+) { byte-array } "default-output-classes" set-word-prop diff --git a/basis/math/vectors/simd/alien/alien-tests.factor b/basis/math/vectors/simd/alien/alien-tests.factor index 62a1d25c58..afdada3c8e 100644 --- a/basis/math/vectors/simd/alien/alien-tests.factor +++ b/basis/math/vectors/simd/alien/alien-tests.factor @@ -1,8 +1,8 @@ IN: math.vectors.simd.alien.tests -USING: cpu.architecture math.vectors.simd accessors -math.vectors.simd.alien kernel classes.struct tools.test -compiler sequences byte-arrays alien math kernel.private -specialized-arrays.float ; +USING: cpu.architecture math.vectors.simd +math.vectors.simd.intrinsics accessors math.vectors.simd.alien +kernel classes.struct tools.test compiler sequences byte-arrays +alien math kernel.private specialized-arrays.float ; ! Vector alien intrinsics [ 4float-array{ 1 2 3 4 } ] [ diff --git a/basis/math/vectors/simd/alien/alien.factor b/basis/math/vectors/simd/alien/alien.factor index c3dd25512c..102559898e 100644 --- a/basis/math/vectors/simd/alien/alien.factor +++ b/basis/math/vectors/simd/alien/alien.factor @@ -1,18 +1,10 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien accessors alien.c-types byte-arrays compiler.units -cpu.architecture libc locals kernel math math.vectors.simd -math.vectors.simd.private ; +cpu.architecture locals kernel math math.vectors.simd +math.vectors.simd.intrinsics ; IN: math.vectors.simd.alien -: alien-vector ( c-ptr n rep -- value ) - ! Inefficient version for when intrinsics are missing - [ swap ] dip rep-size memory>byte-array ; - -: set-alien-vector ( value c-ptr n rep -- ) - ! Inefficient version for when intrinsics are missing - [ swap swap ] dip rep-size memcpy ; - :: define-simd-type ( class rep -- ) byte-array >>class diff --git a/basis/math/vectors/simd/intrinsics/authors.txt b/basis/math/vectors/simd/intrinsics/authors.txt new file mode 100644 index 0000000000..d4f5d6b3ae --- /dev/null +++ b/basis/math/vectors/simd/intrinsics/authors.txt @@ -0,0 +1 @@ +Slava Pestov \ No newline at end of file diff --git a/basis/math/vectors/simd/intrinsics/intrinsics.factor b/basis/math/vectors/simd/intrinsics/intrinsics.factor new file mode 100644 index 0000000000..28547f8cf9 --- /dev/null +++ b/basis/math/vectors/simd/intrinsics/intrinsics.factor @@ -0,0 +1,28 @@ +! Copyright (C) 2009 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel alien alien.c-types cpu.architecture libc ; +IN: math.vectors.simd.intrinsics + +ERROR: bad-simd-call ; + +: (simd-v+) ( v1 v2 rep -- v3 ) bad-simd-call ; +: (simd-v-) ( v1 v2 rep -- v3 ) bad-simd-call ; +: (simd-v*) ( v1 v2 rep -- v3 ) bad-simd-call ; +: (simd-v/) ( v1 v2 rep -- v3 ) bad-simd-call ; +: (simd-vmin) ( v1 v2 rep -- v3 ) bad-simd-call ; +: (simd-vmax) ( v1 v2 rep -- v3 ) bad-simd-call ; +: (simd-vsqrt) ( v1 v2 rep -- v3 ) bad-simd-call ; +: (simd-sum) ( v1 rep -- v2 ) bad-simd-call ; +: (simd-broadcast) ( x rep -- v ) bad-simd-call ; +: (simd-gather-2) ( a b rep -- v ) bad-simd-call ; +: (simd-gather-4) ( a b c d rep -- v ) bad-simd-call ; +: assert-positive ( x -- y ) ; + +: alien-vector ( c-ptr n rep -- value ) + ! Inefficient version for when intrinsics are missing + [ swap ] dip rep-size memory>byte-array ; + +: set-alien-vector ( value c-ptr n rep -- ) + ! Inefficient version for when intrinsics are missing + [ swap swap ] dip rep-size memcpy ; + diff --git a/basis/math/vectors/simd/simd.factor b/basis/math/vectors/simd/simd.factor index a36eee9081..c487e59543 100644 --- a/basis/math/vectors/simd/simd.factor +++ b/basis/math/vectors/simd/simd.factor @@ -2,30 +2,12 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien.c-types byte-arrays cpu.architecture generalizations kernel math math.functions math.vectors -math.vectors.simd.functor math.vectors.specialization parser -prettyprint.custom sequences sequences.private -specialized-arrays.double locals assocs literals words fry ; +math.vectors.simd.functor math.vectors.simd.intrinsics +math.vectors.specialization parser prettyprint.custom sequences +sequences.private specialized-arrays.double locals assocs +literals words fry ; IN: math.vectors.simd - - << DEFER: 4float-array