]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/tree/propagation/simd/simd.factor
909ab931da033b22407d64f52f0e87a3960655c3
[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 assocs byte-arrays combinators compiler.cfg.builder
4 continuations fry sequences compiler.tree.propagation.info
5 cpu.architecture kernel words make math math.intervals
6 math.vectors.simd.intrinsics namespaces ;
7 IN: compiler.tree.propagation.simd
8
9 CONSTANT: vector>vector-intrinsics
10     {
11         (simd-v+)
12         (simd-v-)
13         (simd-vneg)
14         (simd-v+-)
15         (simd-vs+)
16         (simd-vs-)
17         (simd-vs*)
18         (simd-v*)
19         (simd-v*high)
20         (simd-v*hs+)
21         (simd-v/)
22         (simd-vmin)
23         (simd-vmax)
24         (simd-vavg)
25         (simd-vsqrt)
26         (simd-vabs)
27         (simd-vbitand)
28         (simd-vbitandn)
29         (simd-vbitor)
30         (simd-vbitxor)
31         (simd-vbitnot)
32         (simd-vand)
33         (simd-vandn)
34         (simd-vor)
35         (simd-vxor)
36         (simd-vnot)
37         (simd-vlshift)
38         (simd-vrshift)
39         (simd-hlshift)
40         (simd-hrshift)
41         (simd-vshuffle-elements)
42         (simd-vshuffle2-elements)
43         (simd-vshuffle-bytes)
44         (simd-vmerge-head)
45         (simd-vmerge-tail)
46         (simd-v<=)
47         (simd-v<)
48         (simd-v=)
49         (simd-v>)
50         (simd-v>=)
51         (simd-vunordered?)
52         (simd-v>float)
53         (simd-v>integer)
54         (simd-vpack-signed)
55         (simd-vpack-unsigned)
56         (simd-vunpack-head)
57         (simd-vunpack-tail)
58         (simd-with)
59         (simd-gather-2)
60         (simd-gather-4)
61         alien-vector
62     }
63
64 CONSTANT: vector-other-intrinsics
65     {
66         (simd-v.)
67         (simd-vsad)
68         (simd-sum)
69         (simd-vany?)
70         (simd-vall?)
71         (simd-vnone?)
72         (simd-select)
73         set-alien-vector
74     }
75
76 : vector-intrinsics ( -- x )
77     vector>vector-intrinsics vector-other-intrinsics append ;
78
79 vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop ] each
80
81 : scalar-output-class ( rep -- class )
82     dup literal?>> [
83         literal>> scalar-rep-of {
84             { float-rep [ float ] }
85             { double-rep [ float ] }
86             [ drop integer ]
87         } case
88     ] [ drop real ] if
89     <class-info> ;
90
91 \ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop
92
93 \ (simd-v.) [ 2nip scalar-output-class ] "outputs" set-word-prop
94
95 {
96     (simd-vany?)
97     (simd-vall?)
98     (simd-vnone?)
99 } [ { boolean } "default-output-classes" set-word-prop ] each
100
101 \ (simd-select) [ 2nip scalar-output-class ] "outputs" set-word-prop
102
103 \ assert-positive [
104     real [0,inf] <class/interval-info> value-info-intersect
105 ] "outputs" set-word-prop
106
107 : clone-with-value-infos ( node -- node' )
108     clone dup in-d>> [ dup value-info ] H{ } map>assoc >>info ;
109
110 : try-intrinsic ( node intrinsic-quot -- ? )
111     '[
112         _ clone-with-value-infos
113         _ with-dummy-cfg-builder
114         t
115     ] [ drop f ] recover ;
116
117 : inline-unless-intrinsic ( word -- )
118     dup '[
119         _ swap over "intrinsic" word-prop
120         "always-inline-simd-intrinsics" get not swap and
121         ! word node intrinsic
122         [ try-intrinsic [ drop f ] [ def>> ] if ]
123         [ drop def>> ] if*
124     ]
125     "custom-inlining" set-word-prop ;
126
127 vector-intrinsics [ inline-unless-intrinsic ] each