use crate::wasm32::utils::{wasm_unpackhi_i8x16, wasm_unpacklo_i8x16};
use std::arch::wasm32::*;
#[inline]
#[target_feature(enable = "simd128")]
pub fn wasm_load_deinterleave_u8x4(ptr: *const u8) -> (v128, v128, v128, v128) {
unsafe {
let u0 = v128_load(ptr as *const v128); let u1 = v128_load(ptr.add(16) as *const v128); let u2 = v128_load(ptr.add(32) as *const v128); let u3 = v128_load(ptr.add(48) as *const v128);
let v0 = i8x16_shuffle::<0, 4, 8, 12, 16, 20, 24, 28, 1, 5, 9, 13, 17, 21, 25, 29>(u0, u1);
let v1 = i8x16_shuffle::<0, 4, 8, 12, 16, 20, 24, 28, 1, 5, 9, 13, 17, 21, 25, 29>(u2, u3);
let v2 =
i8x16_shuffle::<2, 6, 10, 14, 18, 22, 26, 30, 3, 7, 11, 15, 19, 23, 27, 31>(u0, u1);
let v3 =
i8x16_shuffle::<2, 6, 10, 14, 18, 22, 26, 30, 3, 7, 11, 15, 19, 23, 27, 31>(u2, u3);
let a = i8x16_shuffle::<0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23>(v0, v1);
let b =
i8x16_shuffle::<8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31>(v0, v1);
let c = i8x16_shuffle::<0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23>(v2, v3);
let d =
i8x16_shuffle::<8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31>(v2, v3);
(a, b, c, d)
}
}
#[inline]
#[target_feature(enable = "simd128")]
pub fn wasm_store_interleave_u8x4(ptr: *mut u8, packed: (v128, v128, v128, v128)) {
unsafe {
let a = packed.0;
let b = packed.1;
let c = packed.2;
let d = packed.3;
let u0 = wasm_unpacklo_i8x16(a, c); let u1 = wasm_unpackhi_i8x16(a, c); let u2 = wasm_unpacklo_i8x16(b, d); let u3 = wasm_unpackhi_i8x16(b, d);
let v0 = wasm_unpacklo_i8x16(u0, u2); let v1 = wasm_unpackhi_i8x16(u0, u2); let v2 = wasm_unpacklo_i8x16(u1, u3); let v3 = wasm_unpackhi_i8x16(u1, u3);
v128_store(ptr as *mut v128, v0);
v128_store(ptr.add(16) as *mut v128, v1);
v128_store(ptr.add(32) as *mut v128, v2);
v128_store(ptr.add(48) as *mut v128, v3);
}
}