]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/tree/propagation/simd/simd.factor
Merge branch 'browser' of git://github.com/klazuka/factor
[factor.git] / basis / compiler / tree / propagation / simd / simd.factor
1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors byte-arrays combinators fry sequences
4 compiler.tree.propagation.info cpu.architecture kernel words math
5 math.intervals math.vectors.simd.intrinsics ;
6 IN: compiler.tree.propagation.simd
7
8 {
9     (simd-v+)
10     (simd-v-)
11     (simd-v+-)
12     (simd-v*)
13     (simd-v/)
14     (simd-vmin)
15     (simd-vmax)
16     (simd-sum)
17     (simd-vabs)
18     (simd-vsqrt)
19     (simd-vbitand)
20     (simd-vbitandn)
21     (simd-vbitor)
22     (simd-vbitxor)
23     (simd-vlshift)
24     (simd-vrshift)
25     (simd-hlshift)
26     (simd-hrshift)
27     (simd-vshuffle)
28     (simd-with)
29     (simd-gather-2)
30     (simd-gather-4)
31     alien-vector
32 } [ { byte-array } "default-output-classes" set-word-prop ] each
33
34 : scalar-output-class ( rep -- class )
35     dup literal?>> [
36         literal>> scalar-rep-of {
37             { float-rep [ float ] }
38             { double-rep [ float ] }
39             [ drop integer ]
40         } case
41     ] [ drop real ] if
42     <class-info> ;
43
44 \ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop
45
46 \ (simd-v.) [ 2nip scalar-output-class ] "outputs" set-word-prop
47
48 \ (simd-select) [ 2nip scalar-output-class ] "outputs" set-word-prop
49
50 \ assert-positive [
51     real [0,inf] <class/interval-info> value-info-intersect
52 ] "outputs" set-word-prop
53
54 ! If SIMD is not available, inline alien-vector and set-alien-vector
55 ! to get a speedup
56 : inline-unless-intrinsic ( word -- )
57     dup '[ drop _ dup "intrinsic" word-prop [ drop f ] [ def>> ] if ]
58     "custom-inlining" set-word-prop ;
59
60 \ alien-vector inline-unless-intrinsic
61
62 \ set-alien-vector inline-unless-intrinsic