1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors byte-arrays combinators continuations fry sequences
4 compiler.tree.propagation.info cpu.architecture kernel words make math
5 math.intervals math.vectors.simd.intrinsics ;
6 IN: compiler.tree.propagation.simd
8 CONSTANT: vector>vector-intrinsics
37 (simd-vshuffle-elements)
59 CONSTANT: vector-other-intrinsics
70 : vector-intrinsics ( -- x )
71 vector>vector-intrinsics vector-other-intrinsics append ;
73 vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop ] each
75 : scalar-output-class ( rep -- class )
77 literal>> scalar-rep-of {
78 { float-rep [ float ] }
79 { double-rep [ float ] }
85 \ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop
87 \ (simd-v.) [ 2nip scalar-output-class ] "outputs" set-word-prop
93 } [ { boolean } "default-output-classes" set-word-prop ] each
95 \ (simd-select) [ 2nip scalar-output-class ] "outputs" set-word-prop
98 real [0,inf] <class/interval-info> value-info-intersect
99 ] "outputs" set-word-prop
101 : try-intrinsic ( node intrinsic-quot -- ? )
102 '[ [ _ call( node -- ) ] { } make drop t ] [ 2drop f ] recover ;
104 : inline-unless-intrinsic ( word -- )
106 _ swap over "intrinsic" word-prop
107 ! word node intrinsic
108 [ try-intrinsic [ drop f ] [ def>> ] if ]
111 "custom-inlining" set-word-prop ;
113 vector-intrinsics [ inline-unless-intrinsic ] each