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
9 CONSTANT: vector>vector-intrinsics
41 (simd-vshuffle-elements)
42 (simd-vshuffle2-elements)
64 CONSTANT: vector-other-intrinsics
76 : vector-intrinsics ( -- x )
77 vector>vector-intrinsics vector-other-intrinsics append ;
79 vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop ] each
81 : scalar-output-class ( rep -- class )
83 literal>> scalar-rep-of {
84 { float-rep [ float ] }
85 { double-rep [ float ] }
91 \ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop
93 \ (simd-v.) [ 2nip scalar-output-class ] "outputs" set-word-prop
99 } [ { boolean } "default-output-classes" set-word-prop ] each
101 \ (simd-select) [ 2nip scalar-output-class ] "outputs" set-word-prop
104 real [0,inf] <class/interval-info> value-info-intersect
105 ] "outputs" set-word-prop
107 : clone-with-value-infos ( node -- node' )
108 clone dup in-d>> [ dup value-info ] H{ } map>assoc >>info ;
110 : try-intrinsic ( node intrinsic-quot -- ? )
112 _ clone-with-value-infos
113 _ with-dummy-cfg-builder
115 ] [ drop f ] recover ;
117 : inline-unless-intrinsic ( word -- )
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 ]
125 "custom-inlining" set-word-prop ;
127 vector-intrinsics [ inline-unless-intrinsic ] each