AnyDSL

AnyDSL

SIMD Expression


Contents


Syntax

simd_expr ::= 'simd' '[' (expr ',')* ']'

The last comma is optional.

Typing

The expression simd[e_1, ..., e_n] has type simd[n * T] if all e_i are of type T. T must be a scalar type.

Semantics

All elements are evaluated from left to right and packed into a SIMD value.

Examples

fn mask_store(i: simd[bool * 4], src: simd[int * 4], dst: &mut simd[int * 4]) -> () {
    if i(0) { dst(0) = src(0) }
    if i(1) { dst(1) = src(1) }
    if i(2) { dst(2) = src(2) }
    if i(3) { dst(3) = src(3) }
}

fn main() -> int {
    let mask = simd[true, false, true, false];
    let mut v = simd[1, 2, 3, 4];
    let w = simd[4, 5, 6, 7];
    mask_store(mask, w, &mut v);
    if v(0) + v(1) + v(2) + v(3) == 16 { 0 } else { 1 }
}