macro_rules! wasm_set {
($v:expr; $($acc:ident),+ $(,)?) => {{
let s = $v;
$($acc = s;)+
}};
}
macro_rules! wasm_bin_sv {
($op:path, $v:expr; $($acc:ident),+ $(,)?) => {{
let s = $v;
$($acc = $op(s, $acc);)+
}};
}
macro_rules! wasm_bin_vs {
($op:path, $v:expr; $($acc:ident),+ $(,)?) => {{
let s = $v;
$($acc = $op($acc, s);)+
}};
}
macro_rules! wasm_bin_load_indexed {
(@step $op:path, $p:ident, $i:expr;) => {};
(@step $op:path, $p:ident, $i:expr; $acc:ident $(, $rest:ident)*) => {
$acc = $op(v128_load($p.add($i)), $acc);
wasm_bin_load_indexed!(@step $op, $p, $i + 1; $($rest),*);
};
($op:path, $ptr:expr; $($acc:ident),+ $(,)?) => {{
let p = $ptr as *const v128;
wasm_bin_load_indexed!(@step $op, p, 0usize; $($acc),+);
}};
}
macro_rules! wasm_bin_load_indexed_vs {
(@step $op:path, $p:ident, $i:expr;) => {};
(@step $op:path, $p:ident, $i:expr; $acc:ident $(, $rest:ident)*) => {
$acc = $op($acc, v128_load($p.add($i)));
wasm_bin_load_indexed_vs!(@step $op, $p, $i + 1; $($rest),*);
};
($op:path, $ptr:expr; $($acc:ident),+ $(,)?) => {{
let p = $ptr as *const v128;
wasm_bin_load_indexed_vs!(@step $op, p, 0usize; $($acc),+);
}};
}
macro_rules! wasm_load_indexed {
(@step $p:ident, $i:expr;) => {};
(@step $p:ident, $i:expr; $acc:ident $(, $rest:ident)*) => {
$acc = *$p.add($i);
wasm_load_indexed!(@step $p, $i + 1; $($rest),*);
};
($ptr:expr; $($acc:ident),+ $(,)?) => {{
let p = $ptr as *const v128;
wasm_load_indexed!(@step p, 0usize; $($acc),+);
}};
}
macro_rules! wasm_leaky_relu {
($a:expr; $($acc:ident),+ $(,)?) => {{
let s = f32x4_splat($a);
let zero = f32x4_splat(0.0);
$(
let m = f32x4_gt($acc, zero);
$acc = v128_bitselect($acc, f32x4_mul(s, $acc), m);
)+
}};
}
macro_rules! wasm_bin_splat_indexed {
(@step $op:path, $p:ident, $i:expr;) => {};
(@step $op:path, $p:ident, $i:expr; $acc:ident $(, $rest:ident)*) => {
$acc = $op(f32x4_splat(*$p.add($i)), $acc);
wasm_bin_splat_indexed!(@step $op, $p, $i + 1; $($rest),*);
};
($op:path, $ptr:expr; $($acc:ident),+ $(,)?) => {{
let p = $ptr;
wasm_bin_splat_indexed!(@step $op, p, 0usize; $($acc),+);
}};
}
macro_rules! wasm_bin_splat_indexed_vs {
(@step $op:path, $p:ident, $i:expr;) => {};
(@step $op:path, $p:ident, $i:expr; $acc:ident $(, $rest:ident)*) => {
$acc = $op($acc, f32x4_splat(*$p.add($i)));
wasm_bin_splat_indexed_vs!(@step $op, $p, $i + 1; $($rest),*);
};
($op:path, $ptr:expr; $($acc:ident),+ $(,)?) => {{
let p = $ptr;
wasm_bin_splat_indexed_vs!(@step $op, p, 0usize; $($acc),+);
}};
}
macro_rules! wasm_bin_row_pairs {
(@step $op:path, $p:ident, $i:expr;) => {};
(@step $op:path, $p:ident, $i:expr; ($lo:ident, $hi:ident) $(, $rest:tt)*) => {
let s = f32x4_splat(*$p.add($i));
$lo = $op(s, $lo);
$hi = $op(s, $hi);
wasm_bin_row_pairs!(@step $op, $p, $i + 1; $($rest),*);
};
($op:path, $ptr:expr; $(($lo:ident, $hi:ident)),+ $(,)?) => {{
let p = $ptr;
wasm_bin_row_pairs!(@step $op, p, 0usize; $(($lo, $hi)),+);
}};
}
macro_rules! wasm_bin_row_pairs_vs {
(@step $op:path, $p:ident, $i:expr;) => {};
(@step $op:path, $p:ident, $i:expr; ($lo:ident, $hi:ident) $(, $rest:tt)*) => {
let s = f32x4_splat(*$p.add($i));
$lo = $op($lo, s);
$hi = $op($hi, s);
wasm_bin_row_pairs_vs!(@step $op, $p, $i + 1; $($rest),*);
};
($op:path, $ptr:expr; $(($lo:ident, $hi:ident)),+ $(,)?) => {{
let p = $ptr;
wasm_bin_row_pairs_vs!(@step $op, p, 0usize; $(($lo, $hi)),+);
}};
}
macro_rules! wasm_bin_col_pairs {
($op:path, $ptr:expr; $(($lo:ident, $hi:ident)),+ $(,)?) => {{
let p = $ptr as *const v128;
let clo = v128_load(p);
let chi = v128_load(p.add(1));
$(
$lo = $op(clo, $lo);
$hi = $op(chi, $hi);
)+
}};
}
macro_rules! wasm_bin_col_pairs_vs {
($op:path, $ptr:expr; $(($lo:ident, $hi:ident)),+ $(,)?) => {{
let p = $ptr as *const v128;
let clo = v128_load(p);
let chi = v128_load(p.add(1));
$(
$lo = $op($lo, clo);
$hi = $op($hi, chi);
)+
}};
}