: sign-bit-mask ( rep -- byte-array )
signed-rep {
{ char-16-rep [ uchar-array{
- HEX: 80 HEX: 80 HEX: 80 HEX: 80
- HEX: 80 HEX: 80 HEX: 80 HEX: 80
- HEX: 80 HEX: 80 HEX: 80 HEX: 80
- HEX: 80 HEX: 80 HEX: 80 HEX: 80
+ 0x80 0x80 0x80 0x80
+ 0x80 0x80 0x80 0x80
+ 0x80 0x80 0x80 0x80
+ 0x80 0x80 0x80 0x80
} underlying>> ] }
{ short-8-rep [ ushort-array{
- HEX: 8000 HEX: 8000 HEX: 8000 HEX: 8000
- HEX: 8000 HEX: 8000 HEX: 8000 HEX: 8000
+ 0x8000 0x8000 0x8000 0x8000
+ 0x8000 0x8000 0x8000 0x8000
} underlying>> ] }
{ int-4-rep [ uint-array{
- HEX: 8000,0000 HEX: 8000,0000
- HEX: 8000,0000 HEX: 8000,0000
+ 0x8000,0000 0x8000,0000
+ 0x8000,0000 0x8000,0000
} underlying>> ] }
{ longlong-2-rep [ ulonglong-array{
- HEX: 8000,0000,0000,0000
- HEX: 8000,0000,0000,0000
+ 0x8000,0000,0000,0000
+ 0x8000,0000,0000,0000
} underlying>> ] }
} case ;
: ^shuffle-2-vectors-imm ( src1 src2 shuffle rep -- dst )
[ rep-length 0 pad-tail ] keep {
{ double-2-rep [| src1 src2 shuffle rep |
- shuffle first2 :> ( i j )
+ shuffle first2 [ 4 mod ] bi@ :> ( i j )
{
{ [ i j [ 2 < ] both? ] [
src1 shuffle rep ^shuffle-vector-imm
[ ^^scalar>vector ] keep [ 0 ] dip ^broadcast-vector ;
: ^select-vector ( src n rep -- dst )
- [ ^broadcast-vector ] keep ^^vector>scalar ;
+ {
+ [ ^^select-vector ]
+ [ [ ^broadcast-vector ] keep ^^vector>scalar ]
+ } vl-vector-op ;
! intrinsic emitters
{
[ vcc-none ^^test-vector ]
} emit-v-vector-op ;
+: emit-simd-vgetmask ( node -- )
+ {
+ [ ^^move-vector-mask ]
+ } emit-v-vector-op ;
: emit-simd-v>float ( node -- )
{
: emit-simd-vpack-signed ( node -- )
{
- [ ^^signed-pack-vector ]
+ { double-2-rep [| src1 src2 rep |
+ src1 double-2-rep ^^float-pack-vector :> dst-head
+ src2 double-2-rep ^^float-pack-vector :> dst-tail
+ dst-head dst-tail { 0 1 0 1 } float-4-rep ^^shuffle-vector-halves-imm
+ ] }
+ { int-vector-rep [ ^^signed-pack-vector ] }
} emit-vv-vector-op ;
: emit-simd-vpack-unsigned ( node -- )
: emit-simd-gather-2 ( node -- )
{
+ { fixnum-vector-rep [ ^^gather-int-vector-2 ] }
{ fixnum-vector-rep [ ^^gather-vector-2 ] }
{ float-vector-rep [ ^^gather-vector-2 ] }
} emit-vv-vector-op ;
: emit-simd-gather-4 ( node -- )
{
+ { fixnum-vector-rep [ ^^gather-int-vector-4 ] }
{ fixnum-vector-rep [ ^^gather-vector-4 ] }
{ float-vector-rep [ ^^gather-vector-4 ] }
} emit-vvvv-vector-op ;
dup [
'[
ds-drop prepare-store-memory
- _ f ##store-memory-imm
+ _ f ##store-memory-imm,
]
[ byte-array inline-store-memory? ]
inline-accessor
{ alien-vector [ emit-alien-vector ] }
{ set-alien-vector [ emit-set-alien-vector ] }
{ assert-positive [ drop ] }
+ { (simd-vgetmask) [ emit-simd-vgetmask ] }
} enable-intrinsics ;
enable-simd