! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs byte-arrays combinators compiler.cfg.builder
-continuations fry sequences compiler.tree.propagation.info
-cpu.architecture kernel words make math math.intervals
-math.vectors.simd.intrinsics namespaces ;
+USING: accessors byte-arrays combinators compiler.cfg.builder
+compiler.tree.propagation.info compiler.tree.propagation.nodes
+continuations cpu.architecture kernel layouts math
+math.intervals math.vectors.simd.intrinsics namespaces sequences
+words ;
IN: compiler.tree.propagation.simd
CONSTANT: vector>vector-intrinsics
(simd-vs-)
(simd-vs*)
(simd-v*)
+ (simd-v*high)
+ (simd-v*hs+)
(simd-v/)
(simd-vmin)
(simd-vmax)
+ (simd-vavg)
(simd-vsqrt)
(simd-vabs)
(simd-vbitand)
(simd-hlshift)
(simd-hrshift)
(simd-vshuffle-elements)
+ (simd-vshuffle2-elements)
(simd-vshuffle-bytes)
(simd-vmerge-head)
(simd-vmerge-tail)
CONSTANT: vector-other-intrinsics
{
- (simd-v.)
+ (simd-vdot)
+ (simd-vsad)
(simd-sum)
(simd-vany?)
(simd-vall?)
(simd-vnone?)
+ (simd-vgetmask)
(simd-select)
set-alien-vector
}
literal>> scalar-rep-of {
{ float-rep [ float ] }
{ double-rep [ float ] }
- [ drop integer ]
+ { longlong-scalar-rep [ integer ] }
+ { ulonglong-scalar-rep [ integer ] }
+ { int-scalar-rep [ cell 8 = [ fixnum ] [ integer ] if ] }
+ { uint-scalar-rep [ cell 8 = [ fixnum ] [ integer ] if ] }
+ [ drop fixnum ]
} case
] [ drop real ] if
<class-info> ;
\ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop
-\ (simd-v.) [ 2nip scalar-output-class ] "outputs" set-word-prop
+\ (simd-vdot) [ 2nip scalar-output-class ] "outputs" set-word-prop
{
(simd-vany?)
real [0,inf] <class/interval-info> value-info-intersect
] "outputs" set-word-prop
+\ (simd-vgetmask) { fixnum } "default-output-classes" set-word-prop
+
: clone-with-value-infos ( node -- node' )
- clone dup in-d>> [ dup value-info ] H{ } map>assoc >>info ;
+ clone dup in-d>> extract-value-info >>info ;
: try-intrinsic ( node intrinsic-quot -- ? )
'[
: inline-unless-intrinsic ( word -- )
dup '[
- _ swap over "intrinsic" word-prop
+ _ tuck "intrinsic" word-prop
"always-inline-simd-intrinsics" get not swap and
! word node intrinsic
[ try-intrinsic [ drop f ] [ def>> ] if ]