enable simd intrinsics and fix first-pass compiler errors

db4
Joe Groff 2009-11-18 20:32:05 -08:00
parent 6583875055
commit a3e4ecfc7d
3 changed files with 156 additions and 160 deletions

View File

@ -562,62 +562,62 @@ IN: compiler.cfg.intrinsics.simd
inline-alien inline-alien
] with { [ %alien-vector-reps member? ] } if-literals-match ; ] with { [ %alien-vector-reps member? ] } if-literals-match ;
! : enable-simd ( -- ) : enable-simd ( -- )
! { {
! { (simd-v+) [ emit-simd-v+ ] } { (simd-v+) [ emit-simd-v+ ] }
! { (simd-v-) [ emit-simd-v- ] } { (simd-v-) [ emit-simd-v- ] }
! { (simd-vneg) [ emit-simd-vneg ] } { (simd-vneg) [ emit-simd-vneg ] }
! { (simd-v+-) [ emit-simd-v+- ] } { (simd-v+-) [ emit-simd-v+- ] }
! { (simd-vs+) [ emit-simd-vs+ ] } { (simd-vs+) [ emit-simd-vs+ ] }
! { (simd-vs-) [ emit-simd-vs- ] } { (simd-vs-) [ emit-simd-vs- ] }
! { (simd-vs*) [ emit-simd-vs* ] } { (simd-vs*) [ emit-simd-vs* ] }
! { (simd-v*) [ emit-simd-v* ] } { (simd-v*) [ emit-simd-v* ] }
! { (simd-v/) [ emit-simd-v/ ] } { (simd-v/) [ emit-simd-v/ ] }
! { (simd-vmin) [ emit-simd-vmin ] } { (simd-vmin) [ emit-simd-vmin ] }
! { (simd-vmax) [ emit-simd-vmax ] } { (simd-vmax) [ emit-simd-vmax ] }
! { (simd-v.) [ emit-simd-v. ] } { (simd-v.) [ emit-simd-v. ] }
! { (simd-vsqrt) [ emit-simd-vsqrt ] } { (simd-vsqrt) [ emit-simd-vsqrt ] }
! { (simd-sum) [ emit-simd-sum ] } { (simd-sum) [ emit-simd-sum ] }
! { (simd-vabs) [ emit-simd-vabs ] } { (simd-vabs) [ emit-simd-vabs ] }
! { (simd-vbitand) [ emit-simd-vand ] } { (simd-vbitand) [ emit-simd-vand ] }
! { (simd-vbitandn) [ emit-simd-vandn ] } { (simd-vbitandn) [ emit-simd-vandn ] }
! { (simd-vbitor) [ emit-simd-vor ] } { (simd-vbitor) [ emit-simd-vor ] }
! { (simd-vbitxor) [ emit-simd-vxor ] } { (simd-vbitxor) [ emit-simd-vxor ] }
! { (simd-vbitnot) [ emit-simd-vnot ] } { (simd-vbitnot) [ emit-simd-vnot ] }
! { (simd-vand) [ emit-simd-vand ] } { (simd-vand) [ emit-simd-vand ] }
! { (simd-vandn) [ emit-simd-vandn ] } { (simd-vandn) [ emit-simd-vandn ] }
! { (simd-vor) [ emit-simd-vor ] } { (simd-vor) [ emit-simd-vor ] }
! { (simd-vxor) [ emit-simd-vxor ] } { (simd-vxor) [ emit-simd-vxor ] }
! { (simd-vnot) [ emit-simd-vnot ] } { (simd-vnot) [ emit-simd-vnot ] }
! { (simd-vlshift) [ emit-simd-vlshift ] } { (simd-vlshift) [ emit-simd-vlshift ] }
! { (simd-vrshift) [ emit-simd-vrshift ] } { (simd-vrshift) [ emit-simd-vrshift ] }
! { (simd-hlshift) [ emit-simd-hlshift ] } { (simd-hlshift) [ emit-simd-hlshift ] }
! { (simd-hrshift) [ emit-simd-hrshift ] } { (simd-hrshift) [ emit-simd-hrshift ] }
! { (simd-vshuffle-elements) [ emit-simd-vshuffle-elements ] } { (simd-vshuffle-elements) [ emit-simd-vshuffle-elements ] }
! { (simd-vshuffle-bytes) [ emit-simd-vshuffle-bytes ] } { (simd-vshuffle-bytes) [ emit-simd-vshuffle-bytes ] }
! { (simd-vmerge-head) [ emit-simd-vmerge-head ] } { (simd-vmerge-head) [ emit-simd-vmerge-head ] }
! { (simd-vmerge-tail) [ emit-simd-vmerge-tail ] } { (simd-vmerge-tail) [ emit-simd-vmerge-tail ] }
! { (simd-v<=) [ emit-simd-v<= ] } { (simd-v<=) [ emit-simd-v<= ] }
! { (simd-v<) [ emit-simd-v< ] } { (simd-v<) [ emit-simd-v< ] }
! { (simd-v=) [ emit-simd-v= ] } { (simd-v=) [ emit-simd-v= ] }
! { (simd-v>) [ emit-simd-v> ] } { (simd-v>) [ emit-simd-v> ] }
! { (simd-v>=) [ emit-simd-v>= ] } { (simd-v>=) [ emit-simd-v>= ] }
! { (simd-vunordered?) [ emit-simd-vunordered? ] } { (simd-vunordered?) [ emit-simd-vunordered? ] }
! { (simd-vany?) [ emit-simd-vany? ] } { (simd-vany?) [ emit-simd-vany? ] }
! { (simd-vall?) [ emit-simd-vall? ] } { (simd-vall?) [ emit-simd-vall? ] }
! { (simd-vnone?) [ emit-simd-vnone? ] } { (simd-vnone?) [ emit-simd-vnone? ] }
! { (simd-v>float) [ emit-simd-v>float ] } { (simd-v>float) [ emit-simd-v>float ] }
! { (simd-v>integer) [ emit-simd-v>integer ] } { (simd-v>integer) [ emit-simd-v>integer ] }
! { (simd-vpack-signed) [ emit-simd-vpack-signed ] } { (simd-vpack-signed) [ emit-simd-vpack-signed ] }
! { (simd-vpack-unsigned) [ emit-simd-vpack-unsigned ] } { (simd-vpack-unsigned) [ emit-simd-vpack-unsigned ] }
! { (simd-vunpack-head) [ emit-simd-vunpack-head ] } { (simd-vunpack-head) [ emit-simd-vunpack-head ] }
! { (simd-vunpack-tail) [ emit-simd-vunpack-tail ] } { (simd-vunpack-tail) [ emit-simd-vunpack-tail ] }
! { (simd-with) [ emit-simd-with ] } { (simd-with) [ emit-simd-with ] }
! { (simd-gather-2) [ emit-simd-gather-2 ] } { (simd-gather-2) [ emit-simd-gather-2 ] }
! { (simd-gather-4) [ emit-simd-gather-4 ] } { (simd-gather-4) [ emit-simd-gather-4 ] }
! { (simd-select) [ emit-simd-select ] } { (simd-select) [ emit-simd-select ] }
! { alien-vector [ emit-alien-vector ] } { alien-vector [ emit-alien-vector ] }
! { set-alien-vector [ emit-set-alien-vector ] } { set-alien-vector [ emit-set-alien-vector ] }
! } enable-intrinsics ; } enable-intrinsics ;
!
! enable-simd enable-simd

View File

@ -3,22 +3,13 @@ effects fry io kernel kernel.private math math.functions
math.private math.vectors math.vectors.simd math.private math.vectors math.vectors.simd
math.vectors.simd.private prettyprint random sequences system math.vectors.simd.private prettyprint random sequences system
tools.test vocabs assocs compiler.cfg.debugger words tools.test vocabs assocs compiler.cfg.debugger words
locals math.vectors.specialization combinators cpu.architecture locals combinators cpu.architecture namespaces byte-arrays alien
math.vectors.conversion.backend
math.vectors.simd.intrinsics namespaces byte-arrays alien
specialized-arrays classes.struct eval classes.algebra sets specialized-arrays classes.struct eval classes.algebra sets
quotations math.constants compiler.units ; quotations math.constants compiler.units ;
QUALIFIED-WITH: alien.c-types c QUALIFIED-WITH: alien.c-types c
SPECIALIZED-ARRAY: c:float SPECIALIZED-ARRAY: c:float
SIMD: c:char
SIMDS: c:uchar c:short c:ushort c:int c:uint c:longlong c:ulonglong c:float c:double ;
IN: math.vectors.simd.tests IN: math.vectors.simd.tests
! Make sure the functor doesn't generate bogus vocabularies
2 [ [ "USE: math.vectors.simd SIMD: rubinius" eval( -- ) ] must-fail ] times
[ f ] [ "math.vectors.simd.instances.rubinius" vocab ] unit-test
! Test type propagation ! Test type propagation
[ V{ float } ] [ [ { float-4 } declare norm-sq ] final-classes ] unit-test [ V{ float } ] [ [ { float-4 } declare norm-sq ] final-classes ] unit-test
@ -38,10 +29,6 @@ IN: math.vectors.simd.tests
[ V{ integer } ] [ [ { longlong-2 } declare second ] final-classes ] unit-test [ V{ integer } ] [ [ { longlong-2 } declare second ] final-classes ] unit-test
[ V{ int-8 } ] [ [ { int-8 int-8 } declare v+ ] final-classes ] unit-test
[ t ] [ [ { int-8 } declare second ] final-classes first integer class<= ] unit-test
! Test puns; only on x86 ! Test puns; only on x86
cpu x86? [ cpu x86? [
[ double-2{ 4 1024 } ] [ [ double-2{ 4 1024 } ] [
@ -55,26 +42,76 @@ CONSTANT: simd-classes
{ {
char-16 char-16
uchar-16 uchar-16
char-32
uchar-32
short-8 short-8
ushort-8 ushort-8
short-16
ushort-16
int-4 int-4
uint-4 uint-4
int-8
uint-8
longlong-2 longlong-2
ulonglong-2 ulonglong-2
longlong-4
ulonglong-4
float-4 float-4
float-8
double-2 double-2
double-4
} }
SYMBOLS: -> +vector+ +any-vector+ +scalar+ +boolean+ +nonnegative+ +literal+ ;
CONSTANT: vector-words
H{
{ [v-] { +vector+ +vector+ -> +vector+ } }
{ distance { +vector+ +vector+ -> +nonnegative+ } }
{ n*v { +scalar+ +vector+ -> +vector+ } }
{ n+v { +scalar+ +vector+ -> +vector+ } }
{ n-v { +scalar+ +vector+ -> +vector+ } }
{ n/v { +scalar+ +vector+ -> +vector+ } }
{ norm { +vector+ -> +nonnegative+ } }
{ norm-sq { +vector+ -> +nonnegative+ } }
{ normalize { +vector+ -> +vector+ } }
{ v* { +vector+ +vector+ -> +vector+ } }
{ vs* { +vector+ +vector+ -> +vector+ } }
{ v*n { +vector+ +scalar+ -> +vector+ } }
{ v+ { +vector+ +vector+ -> +vector+ } }
{ vs+ { +vector+ +vector+ -> +vector+ } }
{ v+- { +vector+ +vector+ -> +vector+ } }
{ v+n { +vector+ +scalar+ -> +vector+ } }
{ v- { +vector+ +vector+ -> +vector+ } }
{ vneg { +vector+ -> +vector+ } }
{ vs- { +vector+ +vector+ -> +vector+ } }
{ v-n { +vector+ +scalar+ -> +vector+ } }
{ v. { +vector+ +vector+ -> +scalar+ } }
{ v/ { +vector+ +vector+ -> +vector+ } }
{ v/n { +vector+ +scalar+ -> +vector+ } }
{ vceiling { +vector+ -> +vector+ } }
{ vfloor { +vector+ -> +vector+ } }
{ vmax { +vector+ +vector+ -> +vector+ } }
{ vmin { +vector+ +vector+ -> +vector+ } }
{ vneg { +vector+ -> +vector+ } }
{ vtruncate { +vector+ -> +vector+ } }
{ sum { +vector+ -> +scalar+ } }
{ vabs { +vector+ -> +vector+ } }
{ vsqrt { +vector+ -> +vector+ } }
{ vbitand { +vector+ +vector+ -> +vector+ } }
{ vbitandn { +vector+ +vector+ -> +vector+ } }
{ vbitor { +vector+ +vector+ -> +vector+ } }
{ vbitxor { +vector+ +vector+ -> +vector+ } }
{ vbitnot { +vector+ -> +vector+ } }
{ vand { +vector+ +vector+ -> +vector+ } }
{ vandn { +vector+ +vector+ -> +vector+ } }
{ vor { +vector+ +vector+ -> +vector+ } }
{ vxor { +vector+ +vector+ -> +vector+ } }
{ vnot { +vector+ -> +vector+ } }
{ vlshift { +vector+ +scalar+ -> +vector+ } }
{ vrshift { +vector+ +scalar+ -> +vector+ } }
{ (vmerge-head) { +vector+ +vector+ -> +vector+ } }
{ (vmerge-tail) { +vector+ +vector+ -> +vector+ } }
{ v<= { +vector+ +vector+ -> +vector+ } }
{ v< { +vector+ +vector+ -> +vector+ } }
{ v= { +vector+ +vector+ -> +vector+ } }
{ v> { +vector+ +vector+ -> +vector+ } }
{ v>= { +vector+ +vector+ -> +vector+ } }
{ vunordered? { +vector+ +vector+ -> +vector+ } }
}
: vector-word-inputs ( schema -- seq ) { -> } split first ;
: with-ctors ( -- seq ) : with-ctors ( -- seq )
simd-classes [ [ name>> "-with" append ] [ vocabulary>> ] bi lookup ] map ; simd-classes [ [ name>> "-with" append ] [ vocabulary>> ] bi lookup ] map ;
@ -166,26 +203,15 @@ CONSTANT: simd-classes
: remove-boolean-words ( alist -- alist' ) : remove-boolean-words ( alist -- alist' )
boolean-ops unique assoc-diff ; boolean-ops unique assoc-diff ;
: remove-special-words ( alist -- alist' )
! These have their own tests later
{
hlshift hrshift vshuffle-bytes vshuffle-elements vbroadcast
vany? vall? vnone?
(v>float) (v>integer)
(vpack-signed) (vpack-unsigned)
(vunpack-head) (vunpack-tail)
} unique assoc-diff ;
: ops-to-check ( elt-class -- alist ) : ops-to-check ( elt-class -- alist )
[ vector-words >alist ] dip [ vector-words >alist ] dip
float = [ remove-integer-words ] [ remove-float-words ] if float = [ remove-integer-words ] [ remove-float-words ] if
remove-boolean-words remove-boolean-words ;
remove-special-words ;
: check-vector-ops ( class elt-class compare-quot -- ) : check-vector-ops ( class elt-class compare-quot -- )
[ [
[ nip ops-to-check ] 2keep [ nip ops-to-check ] 2keep
'[ first2 inputs _ _ check-vector-op ] '[ first2 vector-word-inputs _ _ check-vector-op ]
] dip check-optimizer ; inline ] dip check-optimizer ; inline
: (approx=) ( x y -- ? ) : (approx=) ( x y -- ? )
@ -427,27 +453,6 @@ TUPLE: inconsistent-vector-test bool branch ;
[ t f f ] [ t f f ]
[ int-4{ f f f f } { int-4 } test-vector-tests ] unit-test [ int-4{ f f f f } { int-4 } test-vector-tests ] unit-test
[ f t t ]
[ float-8{ t t t t t t t t } { float-8 } test-vector-tests ] unit-test
[ f t f ]
[ float-8{ f t t t t f t t } { float-8 } test-vector-tests ] unit-test
[ t f f ]
[ float-8{ f f f f f f f f } { float-8 } test-vector-tests ] unit-test
[ f t t ]
[ double-4{ t t t t } { double-4 } test-vector-tests ] unit-test
[ f t f ]
[ double-4{ f t t f } { double-4 } test-vector-tests ] unit-test
[ t f f ]
[ double-4{ f f f f } { double-4 } test-vector-tests ] unit-test
[ f t t ]
[ int-8{ t t t t t t t t } { int-8 } test-vector-tests ] unit-test
[ f t f ]
[ int-8{ f t t t t f f f } { int-8 } test-vector-tests ] unit-test
[ t f f ]
[ int-8{ f f f f f f f f } { int-8 } test-vector-tests ] unit-test
"== Checking element access" print "== Checking element access" print
! Test element access -- it should box bignums for int-4 on x86 ! Test element access -- it should box bignums for int-4 on x86
@ -467,14 +472,6 @@ TUPLE: inconsistent-vector-test bool branch ;
[ { } ] [ longlong-2{ 1 2 } test-accesses ] unit-test [ { } ] [ longlong-2{ 1 2 } test-accesses ] unit-test
[ { } ] [ ulonglong-2{ 1 2 } test-accesses ] unit-test [ { } ] [ ulonglong-2{ 1 2 } test-accesses ] unit-test
[ { } ] [ float-8{ 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 } test-accesses ] unit-test
[ { } ] [ int-8{ 1 2 3 4 5 6 7 8 } test-accesses ] unit-test
[ { } ] [ uint-8{ 1 2 3 4 5 6 7 8 } test-accesses ] unit-test
[ { } ] [ double-4{ 1.0 2.0 3.0 4.0 } test-accesses ] unit-test
[ { } ] [ longlong-4{ 1 2 3 4 } test-accesses ] unit-test
[ { } ] [ ulonglong-4{ 1 2 3 4 } test-accesses ] unit-test
"== Checking broadcast" print "== Checking broadcast" print
: test-broadcast ( seq -- failures ) : test-broadcast ( seq -- failures )
[ length >array ] keep [ length >array ] keep
@ -488,14 +485,6 @@ TUPLE: inconsistent-vector-test bool branch ;
[ { } ] [ longlong-2{ 1 2 } test-broadcast ] unit-test [ { } ] [ longlong-2{ 1 2 } test-broadcast ] unit-test
[ { } ] [ ulonglong-2{ 1 2 } test-broadcast ] unit-test [ { } ] [ ulonglong-2{ 1 2 } test-broadcast ] unit-test
[ { } ] [ float-8{ 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 } test-broadcast ] unit-test
[ { } ] [ int-8{ 1 2 3 4 5 6 7 8 } test-broadcast ] unit-test
[ { } ] [ uint-8{ 1 2 3 4 5 6 7 8 } test-broadcast ] unit-test
[ { } ] [ double-4{ 1.0 2.0 3.0 4.0 } test-broadcast ] unit-test
[ { } ] [ longlong-4{ 1 2 3 4 } test-broadcast ] unit-test
[ { } ] [ ulonglong-4{ 1 2 3 4 } test-broadcast ] unit-test
! Make sure we use the fallback in the correct situations ! Make sure we use the fallback in the correct situations
[ int-4{ 3 3 3 3 } ] [ int-4{ 12 34 3 17 } 2 [ { int-4 fixnum } declare vbroadcast ] compile-call ] unit-test [ int-4{ 3 3 3 3 } ] [ int-4{ 12 34 3 17 } 2 [ { int-4 fixnum } declare vbroadcast ] compile-call ] unit-test
@ -529,37 +518,37 @@ TUPLE: inconsistent-vector-test bool branch ;
STRUCT: simd-struct STRUCT: simd-struct
{ x float-4 } { x float-4 }
{ y longlong-2 } { y longlong-2 }
{ z double-4 } { z double-2 }
{ w int-8 } ; { w int-4 } ;
[ t ] [ [ simd-struct <struct> ] compile-call >c-ptr [ 0 = ] all? ] unit-test [ t ] [ [ simd-struct <struct> ] compile-call >c-ptr [ 0 = ] all? ] unit-test
[ [
float-4{ 1 2 3 4 } float-4{ 1 2 3 4 }
longlong-2{ 2 1 } longlong-2{ 2 1 }
double-4{ 4 3 2 1 } double-2{ 4 3 }
int-8{ 1 2 3 4 5 6 7 8 } int-4{ 1 2 3 4 }
] [ ] [
simd-struct <struct> simd-struct <struct>
float-4{ 1 2 3 4 } >>x float-4{ 1 2 3 4 } >>x
longlong-2{ 2 1 } >>y longlong-2{ 2 1 } >>y
double-4{ 4 3 2 1 } >>z double-2{ 4 3 } >>z
int-8{ 1 2 3 4 5 6 7 8 } >>w int-4{ 1 2 3 4 } >>w
{ [ x>> ] [ y>> ] [ z>> ] [ w>> ] } cleave { [ x>> ] [ y>> ] [ z>> ] [ w>> ] } cleave
] unit-test ] unit-test
[ [
float-4{ 1 2 3 4 } float-4{ 1 2 3 4 }
longlong-2{ 2 1 } longlong-2{ 2 1 }
double-4{ 4 3 2 1 } double-2{ 4 3 }
int-8{ 1 2 3 4 5 6 7 8 } int-4{ 1 2 3 4 }
] [ ] [
[ [
simd-struct <struct> simd-struct <struct>
float-4{ 1 2 3 4 } >>x float-4{ 1 2 3 4 } >>x
longlong-2{ 2 1 } >>y longlong-2{ 2 1 } >>y
double-4{ 4 3 2 1 } >>z double-2{ 4 3 } >>z
int-8{ 1 2 3 4 5 6 7 8 } >>w int-4{ 1 2 3 4 } >>w
{ [ x>> ] [ y>> ] [ z>> ] [ w>> ] } cleave { [ x>> ] [ y>> ] [ z>> ] [ w>> ] } cleave
] compile-call ] compile-call
] unit-test ] unit-test
@ -570,8 +559,8 @@ STRUCT: simd-struct
! CSSA bug ! CSSA bug
[ 8000000 ] [ [ 8000000 ] [
int-8{ 1000 1000 1000 1000 1000 1000 1000 1000 } int-4{ 1000 1000 1000 1000 }
[ { int-8 } declare dup [ * ] [ + ] 2map-reduce ] compile-call [ { int-4 } declare dup [ * ] [ + ] 2map-reduce ] compile-call
] unit-test ] unit-test
! Coalescing was too aggressive ! Coalescing was too aggressive

View File

@ -123,6 +123,8 @@ GENERIC: simd-rep ( simd -- rep )
<PRIVATE <PRIVATE
DEFER: simd-construct-op
! SIMD concrete type functor ! SIMD concrete type functor
FUNCTOR: define-simd-128 ( T -- ) FUNCTOR: define-simd-128 ( T -- )
@ -149,7 +151,6 @@ TUPLE: A < simd-128 ;
M: A new-underlying drop \ A boa ; inline M: A new-underlying drop \ A boa ; inline
M: A simd-rep drop A-rep ; inline M: A simd-rep drop A-rep ; inline
M: A simd-element-type drop ELT ; inline M: A simd-element-type drop ELT ; inline
M: A length drop N ; inline
M: A set-nth-unsafe M: A set-nth-unsafe
[ ELT boolean>element ] 2dip [ ELT boolean>element ] 2dip
@ -162,10 +163,14 @@ M: A like drop dup \ A instance? [ >A ] unless ; inline
: A-with ( n -- v ) \ A new simd-with ; inline : A-with ( n -- v ) \ A new simd-with ; inline
: A-cast ( v -- v' ) \ A new simd-cast ; inline : A-cast ( v -- v' ) \ A new simd-cast ; inline
\ A-boa { \ A simd-boa } >quotation BOA-EFFECT define-inline \ A-boa \ A new N {
{ 2 [ '[ _ [ (simd-gather-2) ] simd-construct-op ] ] }
{ 4 [ '[ _ [ (simd-gather-4) ] simd-construct-op ] ] }
[ swap '[ _ _ nsequence ] ]
} case BOA-EFFECT define-inline
! M: A pprint-delims drop \ A{ \ } ; M: A pprint-delims drop \ A{ \ } ;
! SYNTAX: A{ \ } [ >A ] parse-literal ; SYNTAX: A{ \ } [ >A ] parse-literal ;
c:<c-type> c:<c-type>
byte-array >>class byte-array >>class
@ -186,17 +191,6 @@ PRIVATE>
>> >>
SIMD-128: char-16
SIMD-128: uchar-16
SIMD-128: short-8
SIMD-128: ushort-8
SIMD-128: int-4
SIMD-128: uint-4
SIMD-128: longlong-2
SIMD-128: ulonglong-2
SIMD-128: float-4
SIMD-128: double-2
: assert-positive ( x -- y ) ; : assert-positive ( x -- y ) ;
! SIMD vectors as sequences ! SIMD vectors as sequences
@ -351,6 +345,19 @@ M: simd-128 norm-sq dup v. assert-positive ; inline
M: simd-128 norm norm-sq sqrt ; inline M: simd-128 norm norm-sq sqrt ; inline
M: simd-128 distance v- norm ; inline M: simd-128 distance v- norm ; inline
! SIMD instances
SIMD-128: char-16
SIMD-128: uchar-16
SIMD-128: short-8
SIMD-128: ushort-8
SIMD-128: int-4
SIMD-128: uint-4
SIMD-128: longlong-2
SIMD-128: ulonglong-2
SIMD-128: float-4
SIMD-128: double-2
! misc ! misc
M: simd-128 vshuffle ( u perm -- v ) M: simd-128 vshuffle ( u perm -- v )