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
8 IN: compiler.tree.propagation.simd
10 CONSTANT: vector>vector-intrinsics
42 (simd-vshuffle-elements)
43 (simd-vshuffle2-elements)
65 CONSTANT: vector-other-intrinsics
78 : vector-intrinsics ( -- x )
79 vector>vector-intrinsics vector-other-intrinsics append ;
81 vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop ] each
83 : scalar-output-class ( rep -- class )
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 ] }
97 \ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop
99 \ (simd-vdot) [ 2nip scalar-output-class ] "outputs" set-word-prop
105 } [ { boolean } "default-output-classes" set-word-prop ] each
107 \ (simd-select) [ 2nip scalar-output-class ] "outputs" set-word-prop
110 real [0,inf] <class/interval-info> value-info-intersect
111 ] "outputs" set-word-prop
113 \ (simd-vgetmask) { fixnum } "default-output-classes" set-word-prop
115 : clone-with-value-infos ( node -- node' )
116 clone dup in-d>> extract-value-info >>info ;
118 : try-intrinsic ( node intrinsic-quot -- ? )
120 _ clone-with-value-infos
121 _ with-dummy-cfg-builder
123 ] [ drop f ] recover ;
125 : inline-unless-intrinsic ( word -- )
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 ]
133 "custom-inlining" set-word-prop ;
135 vector-intrinsics [ inline-unless-intrinsic ] each