class

SIMD::Base

Inherits Reference / Object

SIMD-oriented primitive interface. Backends implement these with:

  • Scalar fallback
  • x86: AVX2 / AVX-512
  • ARM: NEON / SVE / SVE2

The key is: higher-level code calls these primitives, not intrinsics directly.

Type support:

  • Floating point: Float32, Float64
  • Integers: Int64/UInt64, Int32/UInt32, Int16/UInt16, Int8/UInt8

For signed integers, most operations forward to unsigned versions since SIMD instructions operate on the same bit patterns.

Instance methods

abs(dst : Slice(Float32), a : Slice(Float32)) : Nil

dst[i] = abs(a[i])

Source
abs(dst : Slice(Float64), a : Slice(Float64)) : Nil
Source
abs(dst : Slice(UInt8), a : Slice(UInt8)) : Nil
Source
abs(dst : Slice(Int8), a : Slice(Int8)) : Nil
Source
abs(dst : Slice(UInt16), a : Slice(UInt16)) : Nil
Source
abs(dst : Slice(Int16), a : Slice(Int16)) : Nil
Source
abs(dst : Slice(UInt32), a : Slice(UInt32)) : Nil
Source
abs(dst : Slice(Int32), a : Slice(Int32)) : Nil
Source
abs(dst : Slice(UInt64), a : Slice(UInt64)) : Nil
Source
abs(dst : Slice(Int64), a : Slice(Int64)) : Nil
Source
add(dst : Slice(Float32), a : Slice(Float32), b : Slice(Float32)) : Nil

dst[i] = a[i] + b[i]

Source
add(dst : Slice(Float64), a : Slice(Float64), b : Slice(Float64)) : Nil
Source
add(dst : Slice(UInt64), a : Slice(UInt64), b : Slice(UInt64)) : Nil
Source
add(dst : Slice(Int64), a : Slice(Int64), b : Slice(Int64)) : Nil

Arithmetic - same bit operations

Source
add(dst : Slice(UInt32), a : Slice(UInt32), b : Slice(UInt32)) : Nil
Source
add(dst : Slice(Int32), a : Slice(Int32), b : Slice(Int32)) : Nil
Source
add(dst : Slice(UInt16), a : Slice(UInt16), b : Slice(UInt16)) : Nil
Source
add(dst : Slice(Int16), a : Slice(Int16), b : Slice(Int16)) : Nil
Source
add(dst : Slice(UInt8), a : Slice(UInt8), b : Slice(UInt8)) : Nil
Source
add(dst : Slice(Int8), a : Slice(Int8), b : Slice(Int8)) : Nil
Source
axpby(dst : Slice(Float32), a : Slice(Float32), b : Slice(Float32), alpha : Float32, beta : Float32) : Nil

dst[i] = alpha * a[i] + beta * b[i]

Source
axpby(dst : Slice(Float64), a : Slice(Float64), b : Slice(Float64), alpha : Float64, beta : Float64) : Nil
Source
bitwise_and(dst : Slice(UInt64), a : Slice(UInt64), b : Slice(UInt64)) : Nil
Source
bitwise_and(dst : Slice(Int64), a : Slice(Int64), b : Slice(Int64)) : Nil

Bitwise - same bit operations

Source
bitwise_and(dst : Slice(UInt32), a : Slice(UInt32), b : Slice(UInt32)) : Nil
Source
bitwise_and(dst : Slice(Int32), a : Slice(Int32), b : Slice(Int32)) : Nil
Source
bitwise_and(dst : Slice(UInt16), a : Slice(UInt16), b : Slice(UInt16)) : Nil
Source
bitwise_and(dst : Slice(Int16), a : Slice(Int16), b : Slice(Int16)) : Nil
Source
bitwise_and(dst : Slice(UInt8), a : Slice(UInt8), b : Slice(UInt8)) : Nil
Source
bitwise_and(dst : Slice(Int8), a : Slice(Int8), b : Slice(Int8)) : Nil
Source
bitwise_or(dst : Slice(UInt64), a : Slice(UInt64), b : Slice(UInt64)) : Nil
Source
bitwise_or(dst : Slice(Int64), a : Slice(Int64), b : Slice(Int64)) : Nil
Source
bitwise_or(dst : Slice(UInt32), a : Slice(UInt32), b : Slice(UInt32)) : Nil
Source
bitwise_or(dst : Slice(Int32), a : Slice(Int32), b : Slice(Int32)) : Nil
Source
bitwise_or(dst : Slice(UInt16), a : Slice(UInt16), b : Slice(UInt16)) : Nil
Source
bitwise_or(dst : Slice(Int16), a : Slice(Int16), b : Slice(Int16)) : Nil
Source
bitwise_or(dst : Slice(UInt8), a : Slice(UInt8), b : Slice(UInt8)) : Nil
Source
bitwise_or(dst : Slice(Int8), a : Slice(Int8), b : Slice(Int8)) : Nil
Source
blend(dst : Slice(UInt8), t : Slice(UInt8), f : Slice(UInt8), mask : Slice(UInt8)) : Nil
Source
blend(dst : Slice(Int8), t : Slice(Int8), f : Slice(Int8), mask : Slice(UInt8)) : Nil
Source
bswap(dst : Slice(UInt64), a : Slice(UInt64)) : Nil
Source
bswap(dst : Slice(Int64), a : Slice(Int64)) : Nil
Source
bswap(dst : Slice(UInt32), a : Slice(UInt32)) : Nil
Source
bswap(dst : Slice(Int32), a : Slice(Int32)) : Nil
Source
bswap(dst : Slice(UInt16), a : Slice(UInt16)) : Nil
Source
bswap(dst : Slice(Int16), a : Slice(Int16)) : Nil
Source
ceil(dst : Slice(Float32), a : Slice(Float32)) : Nil

dst[i] = ceil(a[i])

Source
ceil(dst : Slice(Float64), a : Slice(Float64)) : Nil
Source
clamp(dst : Slice(Float32), a : Slice(Float32), lo : Float32, hi : Float32) : Nil

dst[i] = clamp(a[i], lo, hi)

Source
clamp(dst : Slice(Float64), a : Slice(Float64), lo : Float64, hi : Float64) : Nil
Source
clamp(dst : Slice(UInt64), a : Slice(UInt64), lo : UInt64, hi : UInt64) : Nil
Source
clamp(dst : Slice(Int64), a : Slice(Int64), lo : Int64, hi : Int64) : Nil

Clamp needs signed comparison - abstract

Source
clamp(dst : Slice(UInt32), a : Slice(UInt32), lo : UInt32, hi : UInt32) : Nil
Source
clamp(dst : Slice(Int32), a : Slice(Int32), lo : Int32, hi : Int32) : Nil
Source
clamp(dst : Slice(UInt16), a : Slice(UInt16), lo : UInt16, hi : UInt16) : Nil
Source
clamp(dst : Slice(Int16), a : Slice(Int16), lo : Int16, hi : Int16) : Nil
Source
clamp(dst : Slice(UInt8), a : Slice(UInt8), lo : UInt8, hi : UInt8) : Nil
Source
clamp(dst : Slice(Int8), a : Slice(Int8), lo : Int8, hi : Int8) : Nil
Source
cmp_eq(dst_mask : Slice(UInt8), a : Slice(T), b : Slice(T)) : Nil forall T
Source
cmp_ge(dst_mask : Slice(UInt8), a : Slice(T), b : Slice(T)) : Nil forall T
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(Float32), b : Slice(Float32)) : Nil

Writes an output mask byte per element: 0xFF if a[i] > b[i], else 0x00

Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(Float64), b : Slice(Float64)) : Nil
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(UInt64), b : Slice(UInt64)) : Nil
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(Int64), b : Slice(Int64)) : Nil

Compare/mask - needs signed comparison

Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(UInt32), b : Slice(UInt32)) : Nil
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(Int32), b : Slice(Int32)) : Nil
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(UInt16), b : Slice(UInt16)) : Nil
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(Int16), b : Slice(Int16)) : Nil
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(UInt8), b : Slice(UInt8)) : Nil
Source
cmp_gt_mask(dst_mask : Slice(UInt8), a : Slice(Int8), b : Slice(Int8)) : Nil
Source
cmp_le(dst_mask : Slice(UInt8), a : Slice(T), b : Slice(T)) : Nil forall T
Source
cmp_lt(dst_mask : Slice(UInt8), a : Slice(T), b : Slice(T)) : Nil forall T
Source
cmp_ne(dst_mask : Slice(UInt8), a : Slice(T), b : Slice(T)) : Nil forall T
Source
convert(dst : Slice(Float32), src : Slice(UInt8), scale : Float32) : Nil

UInt8 -> Float32 with scale

Source
convert(dst : Slice(Float32), src : Slice(Int16)) : Nil

Int16 -> Float32

Source
convert(dst : Slice(Float64), src : Slice(Int32)) : Nil

Int32 -> Float64

Source
convert(dst : Slice(Float64), src : Slice(Int16)) : Nil

Int16 -> Float64

Source
convert(dst : Slice(Float64), src : Slice(Float32)) : Nil

Float32 -> Float64 (widening)

Source
convert(dst : Slice(Float32), src : Slice(Float64)) : Nil

Float64 -> Float32 (narrowing)

Source
copy(dst : Slice(UInt8), src : Slice(UInt8)) : Nil

dst[i] = src[i] (may use wide loads/stores + prefetch)

Source
div(dst : Slice(Float32), a : Slice(Float32), b : Slice(Float32)) : Nil

dst[i] = a[i] / b[i]

Source
div(dst : Slice(Float64), a : Slice(Float64), b : Slice(Float64)) : Nil
Source
dot(a : Slice(Float32), b : Slice(Float32)) : Float32

Returns dot(a,b) = sum(a[i] * b[i]) (can use FMA)

Source
dot(a : Slice(Float64), b : Slice(Float64)) : Float64
Source
fill(dst : Slice(UInt8), value : UInt8) : Nil

Set all bytes to value (memset-like)

Source
fir(dst : Slice(Float32), src : Slice(Float32), coeff : Slice(Float32)) : Nil

1D FIR: dst[i] = sum_{k=0..taps-1} coeff[k] * src[i+k]

Source
fir(dst : Slice(Float64), src : Slice(Float64), coeff : Slice(Float64)) : Nil
Source
floor(dst : Slice(Float32), a : Slice(Float32)) : Nil

dst[i] = floor(a[i])

Source
floor(dst : Slice(Float64), a : Slice(Float64)) : Nil
Source
fma(dst : Slice(Float32), a : Slice(Float32), b : Slice(Float32), c : Slice(Float32)) : Nil

dst[i] = a[i] * b[i] + c[i] (FMA on capable backends)

Source
fma(dst : Slice(Float64), a : Slice(Float64), b : Slice(Float64), c : Slice(Float64)) : Nil
Source
max(dst : Slice(T), a : Slice(T), b : Slice(T)) : Nil forall T
Source
max(a : Slice(Float32)) : Float32

Returns max(a[i])

Source
max(a : Slice(Float64)) : Float64
Source
max(a : Slice(UInt64)) : UInt64
Source
max(a : Slice(Int64)) : Int64
Source
max(a : Slice(UInt32)) : UInt32
Source
max(a : Slice(Int32)) : Int32
Source
max(a : Slice(UInt16)) : UInt16
Source
max(a : Slice(Int16)) : Int16
Source
max(a : Slice(UInt8)) : UInt8
Source
max(a : Slice(Int8)) : Int8
Source
min(dst : Slice(T), a : Slice(T), b : Slice(T)) : Nil forall T
Source
min(a : Slice(Float32)) : Float32

Returns min(a[i])

Source
min(a : Slice(Float64)) : Float64
Source
min(a : Slice(UInt64)) : UInt64
Source
min(a : Slice(Int64)) : Int64
Source
min(a : Slice(UInt32)) : UInt32
Source
min(a : Slice(Int32)) : Int32
Source
min(a : Slice(UInt16)) : UInt16
Source
min(a : Slice(Int16)) : Int16
Source
min(a : Slice(UInt8)) : UInt8
Source
min(a : Slice(Int8)) : Int8
Source
mul(dst : Slice(Float32), a : Slice(Float32), b : Slice(Float32)) : Nil

dst[i] = a[i] * b[i]

Source
mul(dst : Slice(Float64), a : Slice(Float64), b : Slice(Float64)) : Nil
Source
mul(dst : Slice(UInt64), a : Slice(UInt64), b : Slice(UInt64)) : Nil
Source
mul(dst : Slice(Int64), a : Slice(Int64), b : Slice(Int64)) : Nil
Source
mul(dst : Slice(UInt32), a : Slice(UInt32), b : Slice(UInt32)) : Nil
Source
mul(dst : Slice(Int32), a : Slice(Int32), b : Slice(Int32)) : Nil
Source
mul(dst : Slice(UInt16), a : Slice(UInt16), b : Slice(UInt16)) : Nil
Source
mul(dst : Slice(Int16), a : Slice(Int16), b : Slice(Int16)) : Nil
Source
mul(dst : Slice(UInt8), a : Slice(UInt8), b : Slice(UInt8)) : Nil
Source
mul(dst : Slice(Int8), a : Slice(Int8), b : Slice(Int8)) : Nil
Source
neg(dst : Slice(Float32), a : Slice(Float32)) : Nil

dst[i] = -a[i]

Source
neg(dst : Slice(Float64), a : Slice(Float64)) : Nil
Source
neg(dst : Slice(Int8), a : Slice(Int8)) : Nil
Source
neg(dst : Slice(Int16), a : Slice(Int16)) : Nil
Source
neg(dst : Slice(Int32), a : Slice(Int32)) : Nil
Source
neg(dst : Slice(Int64), a : Slice(Int64)) : Nil
Source
popcount(a : Slice(UInt8)) : UInt64

popcount returns total bits set across slice

Source
round(dst : Slice(Float32), a : Slice(Float32)) : Nil

dst[i] = round(a[i])

Source
round(dst : Slice(Float64), a : Slice(Float64)) : Nil
Source
rsqrt(dst : Slice(Float32), a : Slice(Float32)) : Nil

dst[i] = 1 / sqrt(a[i]) (fast approx on capable backends)

Source
rsqrt(dst : Slice(Float64), a : Slice(Float64)) : Nil
Source
sqrt(dst : Slice(Float32), a : Slice(Float32)) : Nil

dst[i] = sqrt(a[i])

Source
sqrt(dst : Slice(Float64), a : Slice(Float64)) : Nil
Source
sub(dst : Slice(Float32), a : Slice(Float32), b : Slice(Float32)) : Nil

dst[i] = a[i] - b[i]

Source
sub(dst : Slice(Float64), a : Slice(Float64), b : Slice(Float64)) : Nil
Source
sub(dst : Slice(UInt64), a : Slice(UInt64), b : Slice(UInt64)) : Nil
Source
sub(dst : Slice(Int64), a : Slice(Int64), b : Slice(Int64)) : Nil
Source
sub(dst : Slice(UInt32), a : Slice(UInt32), b : Slice(UInt32)) : Nil
Source
sub(dst : Slice(Int32), a : Slice(Int32), b : Slice(Int32)) : Nil
Source
sub(dst : Slice(UInt16), a : Slice(UInt16), b : Slice(UInt16)) : Nil
Source
sub(dst : Slice(Int16), a : Slice(Int16), b : Slice(Int16)) : Nil
Source
sub(dst : Slice(UInt8), a : Slice(UInt8), b : Slice(UInt8)) : Nil
Source
sub(dst : Slice(Int8), a : Slice(Int8), b : Slice(Int8)) : Nil
Source
sum(a : Slice(Float32)) : Float32

Returns sum(a[i])

Source
sum(a : Slice(Float64)) : Float64
Source
sum(a : Slice(UInt64)) : UInt64
Source
sum(a : Slice(Int64)) : Int64

Reductions - sum same bits, max/min need signed comparison

Source
sum(a : Slice(UInt32)) : UInt32
Source
sum(a : Slice(Int32)) : Int32
Source
sum(a : Slice(UInt16)) : UInt16
Source
sum(a : Slice(Int16)) : Int16
Source
sum(a : Slice(UInt8)) : UInt8
Source
sum(a : Slice(Int8)) : Int8
Source
xor(dst : Slice(UInt64), a : Slice(UInt64), b : Slice(UInt64)) : Nil
Source
xor(dst : Slice(Int64), a : Slice(Int64), b : Slice(Int64)) : Nil
Source
xor(dst : Slice(UInt32), a : Slice(UInt32), b : Slice(UInt32)) : Nil
Source
xor(dst : Slice(Int32), a : Slice(Int32), b : Slice(Int32)) : Nil
Source
xor(dst : Slice(UInt16), a : Slice(UInt16), b : Slice(UInt16)) : Nil
Source
xor(dst : Slice(Int16), a : Slice(Int16), b : Slice(Int16)) : Nil
Source
xor(dst : Slice(UInt8), a : Slice(UInt8), b : Slice(UInt8)) : Nil
Source
xor(dst : Slice(Int8), a : Slice(Int8), b : Slice(Int8)) : Nil
Source
xor_block16(dst : Slice(UInt8), src : Slice(UInt8), key16 : StaticArray(UInt8, 16)) : Nil

XOR a stream with a 16-byte repeated block key

Source