| 
									
										
										
										
											2009-09-03 03:33:07 -04:00
										 |  |  | ! Copyright (C) 2009 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2014-12-13 19:10:21 -05:00
										 |  |  | USING: accessors byte-arrays combinators compiler.cfg.builder | 
					
						
							|  |  |  | compiler.tree.propagation.info compiler.tree.propagation.nodes | 
					
						
							|  |  |  | continuations cpu.architecture fry kernel layouts math | 
					
						
							|  |  |  | math.intervals math.vectors.simd.intrinsics namespaces sequences | 
					
						
							|  |  |  | words ;
 | 
					
						
							| 
									
										
										
										
											2009-09-03 03:33:07 -04:00
										 |  |  | IN: compiler.tree.propagation.simd | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  | CONSTANT: vector>vector-intrinsics | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         (simd-v+) | 
					
						
							|  |  |  |         (simd-v-) | 
					
						
							|  |  |  |         (simd-vneg) | 
					
						
							|  |  |  |         (simd-v+-) | 
					
						
							|  |  |  |         (simd-vs+) | 
					
						
							|  |  |  |         (simd-vs-) | 
					
						
							|  |  |  |         (simd-vs*) | 
					
						
							|  |  |  |         (simd-v*) | 
					
						
							| 
									
										
										
										
											2009-12-05 17:52:18 -05:00
										 |  |  |         (simd-v*high) | 
					
						
							|  |  |  |         (simd-v*hs+) | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |         (simd-v/) | 
					
						
							|  |  |  |         (simd-vmin) | 
					
						
							|  |  |  |         (simd-vmax) | 
					
						
							| 
									
										
										
										
											2009-12-05 17:52:18 -05:00
										 |  |  |         (simd-vavg) | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |         (simd-vsqrt) | 
					
						
							|  |  |  |         (simd-vabs) | 
					
						
							|  |  |  |         (simd-vbitand) | 
					
						
							|  |  |  |         (simd-vbitandn) | 
					
						
							|  |  |  |         (simd-vbitor) | 
					
						
							|  |  |  |         (simd-vbitxor) | 
					
						
							|  |  |  |         (simd-vbitnot) | 
					
						
							|  |  |  |         (simd-vand) | 
					
						
							|  |  |  |         (simd-vandn) | 
					
						
							|  |  |  |         (simd-vor) | 
					
						
							|  |  |  |         (simd-vxor) | 
					
						
							|  |  |  |         (simd-vnot) | 
					
						
							|  |  |  |         (simd-vlshift) | 
					
						
							|  |  |  |         (simd-vrshift) | 
					
						
							|  |  |  |         (simd-hlshift) | 
					
						
							|  |  |  |         (simd-hrshift) | 
					
						
							|  |  |  |         (simd-vshuffle-elements) | 
					
						
							| 
									
										
										
										
											2010-05-14 05:47:39 -04:00
										 |  |  |         (simd-vshuffle2-elements) | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |         (simd-vshuffle-bytes) | 
					
						
							|  |  |  |         (simd-vmerge-head) | 
					
						
							|  |  |  |         (simd-vmerge-tail) | 
					
						
							|  |  |  |         (simd-v<=) | 
					
						
							|  |  |  |         (simd-v<) | 
					
						
							|  |  |  |         (simd-v=) | 
					
						
							|  |  |  |         (simd-v>) | 
					
						
							|  |  |  |         (simd-v>=) | 
					
						
							|  |  |  |         (simd-vunordered?) | 
					
						
							|  |  |  |         (simd-v>float) | 
					
						
							|  |  |  |         (simd-v>integer) | 
					
						
							|  |  |  |         (simd-vpack-signed) | 
					
						
							|  |  |  |         (simd-vpack-unsigned) | 
					
						
							|  |  |  |         (simd-vunpack-head) | 
					
						
							|  |  |  |         (simd-vunpack-tail) | 
					
						
							|  |  |  |         (simd-with) | 
					
						
							|  |  |  |         (simd-gather-2) | 
					
						
							|  |  |  |         (simd-gather-4) | 
					
						
							|  |  |  |         alien-vector | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CONSTANT: vector-other-intrinsics | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         (simd-v.) | 
					
						
							| 
									
										
										
										
											2009-12-05 17:52:18 -05:00
										 |  |  |         (simd-vsad) | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |         (simd-sum) | 
					
						
							|  |  |  |         (simd-vany?) | 
					
						
							|  |  |  |         (simd-vall?) | 
					
						
							|  |  |  |         (simd-vnone?) | 
					
						
							| 
									
										
										
										
											2011-11-12 01:47:54 -05:00
										 |  |  |         (simd-vgetmask) | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |         (simd-select) | 
					
						
							|  |  |  |         set-alien-vector | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : vector-intrinsics ( -- x )
 | 
					
						
							|  |  |  |     vector>vector-intrinsics vector-other-intrinsics append ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop ] each
 | 
					
						
							| 
									
										
										
										
											2009-09-03 03:33:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 00:12:13 -04:00
										 |  |  | : scalar-output-class ( rep -- class )
 | 
					
						
							|  |  |  |     dup literal?>> [ | 
					
						
							| 
									
										
										
										
											2009-09-03 03:33:07 -04:00
										 |  |  |         literal>> scalar-rep-of { | 
					
						
							| 
									
										
										
										
											2009-09-03 21:58:56 -04:00
										 |  |  |             { float-rep [ float ] } | 
					
						
							|  |  |  |             { double-rep [ float ] } | 
					
						
							| 
									
										
										
										
											2011-11-12 20:00:39 -05:00
										 |  |  |             { 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 ] | 
					
						
							| 
									
										
										
										
											2009-09-03 03:33:07 -04:00
										 |  |  |         } case
 | 
					
						
							|  |  |  |     ] [ drop real ] if
 | 
					
						
							| 
									
										
										
										
											2009-09-29 00:12:13 -04:00
										 |  |  |     <class-info> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ (simd-v.) [ 2nip scalar-output-class ] "outputs" set-word-prop | 
					
						
							| 
									
										
										
										
											2009-09-03 03:33:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:35:38 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     (simd-vany?) | 
					
						
							|  |  |  |     (simd-vall?) | 
					
						
							|  |  |  |     (simd-vnone?) | 
					
						
							|  |  |  | } [ { boolean } "default-output-classes" set-word-prop ] each
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 05:46:38 -04:00
										 |  |  | \ (simd-select) [ 2nip scalar-output-class ] "outputs" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-03 03:33:07 -04:00
										 |  |  | \ assert-positive [ | 
					
						
							|  |  |  |     real [0,inf] <class/interval-info> value-info-intersect | 
					
						
							|  |  |  | ] "outputs" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-12 01:47:54 -05:00
										 |  |  | \ (simd-vgetmask) { fixnum } "default-output-classes" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 14:37:28 -05:00
										 |  |  | : clone-with-value-infos ( node -- node' )
 | 
					
						
							| 
									
										
										
										
											2011-10-16 22:33:16 -04:00
										 |  |  |     clone dup in-d>> extract-value-info >>info ;
 | 
					
						
							| 
									
										
										
										
											2009-11-24 14:37:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  | : try-intrinsic ( node intrinsic-quot -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-11-24 14:37:28 -05:00
										 |  |  |     '[ | 
					
						
							|  |  |  |         _ clone-with-value-infos | 
					
						
							|  |  |  |         _ with-dummy-cfg-builder | 
					
						
							|  |  |  |         t
 | 
					
						
							|  |  |  |     ] [ drop f ] recover ;
 | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-08 14:56:17 -04:00
										 |  |  | : inline-unless-intrinsic ( word -- )
 | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |     dup '[ | 
					
						
							|  |  |  |         _ swap over "intrinsic" word-prop | 
					
						
							| 
									
										
										
										
											2009-11-26 16:28:40 -05:00
										 |  |  |         "always-inline-simd-intrinsics" get not swap and
 | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |         ! word node intrinsic | 
					
						
							|  |  |  |         [ try-intrinsic [ drop f ] [ def>> ] if ] | 
					
						
							| 
									
										
										
										
											2009-11-26 16:28:40 -05:00
										 |  |  |         [ drop def>> ] if*
 | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2009-09-08 14:56:17 -04:00
										 |  |  |     "custom-inlining" set-word-prop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 00:24:55 -05:00
										 |  |  | vector-intrinsics [ inline-unless-intrinsic ] each
 |