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